Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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
在free()之后调用的malloc()是否可能返回指向同一个已释放内存的指针?_C_Operating System - Fatal编程技术网

在free()之后调用的malloc()是否可能返回指向同一个已释放内存的指针?

在free()之后调用的malloc()是否可能返回指向同一个已释放内存的指针?,c,operating-system,C,Operating System,我正在编写一个应用程序,它在while(1)中持续运行,并等待一个中断(基本上是一个环)来解码消息。因此,当我成功解码消息时,我只需要打印它并开始等待另一个中断(新消息) 我想在开始新消息之前清除所有数据结构。所以我只是释放指针,然后把它们放回去。但当我这样做时,数据结构中仍然有一些字段包含旧数据。所以我只是使用calloc()清除所有内存,以清除旧数据 我知道调用free释放的内存不会立即返回操作系统,它仍然位于可用内存池中,但是malloc是否可以返回相同的释放内存 if(res){

我正在编写一个应用程序,它在while(1)中持续运行,并等待一个中断(基本上是一个环)来解码消息。因此,当我成功解码消息时,我只需要打印它并开始等待另一个中断(新消息)

我想在开始新消息之前清除所有数据结构。所以我只是释放指针,然后把它们放回去。但当我这样做时,数据结构中仍然有一些字段包含旧数据。所以我只是使用calloc()清除所有内存,以清除旧数据

我知道调用free释放的内存不会立即返回操作系统,它仍然位于可用内存池中,但是malloc是否可以返回相同的释放内存

if(res){                               // If decoded successfully
        display_CID_info(cs, cs_data); // Display CallerID message
        free(cs);                      // Free the CID data structure
        free(cs_data);                 // Free message data structure

        /* Allocate Data structures again for next iteration */
        cs_data = malloc(sizeof(cid_data));
        cs = calloc(1, sizeof(*cid));
    }

是的,这是完全可能的。当您调用free时,内存管理器会将该内存段标记为一个片段,可能会将其与相邻片段组合,但不会将数据设置为全零。
malloc()
函数也不会将所有数据设置为全零


例如,如果在程序中第一次调用
free()
,然后立即调用
malloc()
,以获得相等或更少的内存量,那么内存管理器完全有可能重用旧的片段。

当然,为什么不呢?如果要清除内存,请使用memset()自己清除,或使用calloc()。由For()释放的内存根本不返回到OS,它被合并了。事实上,你在<代码> MaloC/< Cald> ED数据结构中检测旧数据表明,在编写之前,你正在读取错误的东西。不要为C问题添加C++标签。有什么问题?无论如何,您都必须初始化动态内存,因为不能保证它会被
malloc
归零。请澄清,因为没有人明确说过:在任何情况下,您都不能依赖malloc()返回您刚刚释放的相同内存()。这将是一种未定义的行为,并且会引发可怕的bug。我认为这是一个开放和关闭的案例!!谢谢值得澄清的是,这在实践中是可能的,并且标准允许这样做,但这是特定于实现的行为。