c/c++语言开发共享使用free()时的分段错误

此代码导致分段错误:

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 

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

    你在一块没有使用malloc方法分配的内存块上调用free

    当你这样做时: p = a你将p分配给堆栈数组a使用的内存。 该内存未使用malloc分配,因此无法使用free释放。

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

    这个:

     p = a; 

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

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


    它还会导致内存泄漏。

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

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

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

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

     p = a; // p points a 

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

      以上就是c/c++开发分享使用free()时的分段错误相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560224.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐