使用free()时的分段错误

时间:2012-06-17 23:48:16

标签: 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;
}

执行此程序后的输出是:

Allocation Success

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Segmentation fault

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

5 个答案:

答案 0 :(得分:12)

此:

p = a;

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

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

<小时/> <子> 1。它还会导致内存泄漏。

答案 1 :(得分:10)

您正在使用free方法之一未分配的内存块上调用malloc

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

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

答案 2 :(得分:0)

char a[50]在堆栈上分配一个包含50个字符的数组。因此a指向堆栈上的地址。

p = a设置 p 指向与 a 相同的地址。因此,在p = a之后,p指向堆栈上的地址。请记住, p 包含地址

之后,free(p)尝试释放堆栈上的内存区域,这是非法的。你只能释放你从malloc()获得的记忆。

答案 3 :(得分:0)

你实际上是指memcpy(p,a,50);不是p = a,记住C没有字符串数据类型。

答案 4 :(得分:0)

p = a; // p points a

执行此行,p应该指向const字符串(char *)。 您无法通过调用free()malloccalloc无法获得任何内容。因为在这个例子中你尝试free()一个const字符串,你会收到一个错误。