Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C free()分配了两次内存,是否会导致segfault?_C_Malloc_Core - Fatal编程技术网

C free()分配了两次内存,是否会导致segfault?

C free()分配了两次内存,是否会导致segfault?,c,malloc,core,C,Malloc,Core,如果我们两次释放()与malloc()分配的同一个字符指针,会导致segflut吗 void Allocate() { char *y; y = (char *) malloc (sizeof(char) * 200); free (y); strcpy(y,"helloworld"); free (y); } int main() { Allocate(); return 0; } 这是未定义的行为,所以不要这样做 更重

如果我们两次释放()与malloc()分配的同一个字符指针,会导致segflut吗

void Allocate() 
{     
   char *y;
   y = (char *) malloc (sizeof(char) * 200);    
   free (y);
   strcpy(y,"helloworld");
   free (y);
}

int main()
{
     Allocate();
     return 0;
}

这是未定义的行为,所以不要这样做

更重要的是,在调用
free()
后不要使用内存,这是一个完全不允许的情况:

free (y);
strcpy(y,"helloworld");
以上也是未定义的行为


另外,.

两次释放同一内存将导致未定义的行为,写入已释放的内存也会导致未定义的行为(请参见
strcpy

C标准将§1.3.12节中未定义的行为定义为:

使用错误的程序结构或错误的数据时可能出现的行为,本国际标准对此不作要求[3]

当本国际标准省略任何明确的行为定义时,也可能出现未定义的行为

(3) =允许的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特有的文件化方式(发出或不发出诊断消息)行为,到终止翻译或执行(发出诊断信息)

至于发生了什么,我猜如下:

  • 你可以自由
    y

  • 然后对曾经的
    y
    执行strcpy,这可能会损坏堆;这本身不太可能发生故障,但可能(见上文)

  • 然后分配
    z
    ,这会使用可能已损坏的堆,并可能导致内存错误或分配错误(即返回无法使用的地址)

  • 然后将strcpy
    strcpy
    插入可能分配错误的内存位,从而可能导致故障

  • 然后,再次释放
    y
    ,释放的堆可能已损坏,可能会出错等


  • 如果您真的想知道,请使用debug
    libc
    gdb
    找出答案。

    释放同一指针两次可能会导致堆损坏。在取消分配后的程序中,您试图复制一个字符串,这将导致segfault。

    我检查过它不会转储内核。@mangusta:自检会验证特定编译器的某些内容呃,在一个特定的月球阶段。有时这就足够了,其他时候最好检查一下标准(或其他)。在我的应用程序中,我得到了核心转储,但在这个示例代码中,我没有得到核心转储。@Jeyamaran是的,那是因为未定义的行为。你不能依赖于得到任何特定的结果。它是未定义的。清楚吗?哦,但在某些情况下,它肯定会正确创建核心转储。但我没有得到任何核心转储。我尝试了各种方法,但没有得到核心转储即使是一次转储。你可以在这里找到如何启用核心转储。永远不能保证你会因为违反了程序的内存而得到一个核心转储。我已经知道了这些东西。但我只需要它在任何情况下都会进行核心转储。问题是“它会导致segfalut”(原文如此),而不是“它会导致核心转储吗”.Segfaults并不总是导致核心转储。在运行它以获得核心转储之前,必须执行(依赖操作系统)
    ulimit-c unlimited