4

此代码导致分段错误:

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

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

4

5 回答 5

12

这:

p = a;

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

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


1. 而且还会造成内存泄露。

于 2012-06-17T23:50:04.133 回答
10

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

当你这样做时:p = a你正在分配p堆栈数组使用的内存a。该内存不是使用分配的malloc,因此无法使用free.

此外,通过重新分配,您将忘记最初分配malloc并分配给的块p,从而导致内存泄漏。

于 2012-06-17T23:50:09.910 回答
0

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

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

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

于 2012-06-17T23:53:06.920 回答
0

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

于 2012-06-18T00:26:13.753 回答
0
p = a; // p points a

执行这一行,p 应该指向 const string ( char *)。您不能通过调用orfree()获得任何东西。由于在此示例中您尝试使用 const 字符串,因此会出现错误。malloccallocfree()

于 2012-06-18T06:31:39.413 回答