使用free()时的分段错误

lea*_*ner 4 c c++ string

此代码导致分段错误:

int main(){

    char *p;
    char a[50] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    p = (char *)malloc(50*sizeof(char));

    if(!p){
            cout << "Allocation Failure";
            cout << "\n";
    }
    else{
            cout << "Allocation Success";
            cout << "\n";
            p = a;
            cout << p;
            cout << "\n";
            free(p);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

执行该程序后的输出是:

Allocation Success

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Segmentation fault
Run Code Online (Sandbox Code Playgroud)

我无法找到错误.可能是什么原因?

Oli*_*rth 12

这个:

p = a;
Run Code Online (Sandbox Code Playgroud)

复制指针,而不是指向内存的内容. p现在指向数组的第一个元素a.所以当你这样做的时候free(p),你正试图释放一个没有任何意义的非动态数组.1

您应该调查strncpy()复制字符串.


它还会导致内存泄漏.


pb2*_*b2q 10

您正在调用free未使用其中一种malloc方法分配的内存块.

执行此操作时:p = a您将分配给p堆栈数组使用的内存a.该内存未使用分配malloc,因此无法使用它free.

此外,通过重新分配,您将malloc无法跟踪最初分配和分配的块p,从而导致内存泄漏.