使用 free() 时的分段错误

segmentation fault when free() is used

本文关键字:分段 错误 free 使用      更新时间:2023-10-16

此代码会导致分段错误:

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

我找不到该错误。可能是什么原因?

这个:

p = a;

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

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


1.它还会导致内存泄漏。

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

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

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

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

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

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

你的意思是memcpy(p,a,50);不是p=a,记住C没有字符串数据类型。

p = a; // p points a

执行此行时,p 应指向常量字符串 ( char * )。您不能free()任何不是通过调用 malloccalloc 获得的内容。由于在此示例中,您尝试free() const 字符串,因此会出现错误。