在这种情况下,了解悬空指针行为

我有一个指针,默认情况下它携带NULL然后它等待一些事件并在事件发生时获取一个值,稍后我释放指针在其他地方,但即使在释放指针后我没有使它为NULL所以它仍然保持引用相同的内存位置 ,我知道下一个malloc调用可能会将该内存块分配给其他内存请求!

pointer_type *p = NULL; while (process_get_wakeup(//some logic//)) { while ((qelem = (void*)process_dequeue(//some logic//)) != NULL) { p = (pointer_type *)qelem; } . . //goes into a loop of calls where free(p) is also done! . . //Printing value of p as %p gives this : 0xFF00000000 

编辑: 我已经知道它不是我们应该如何做到的 ,我不能指望保留与现在可能用于其他东西的值相同的值,但我想知道的是为什么只有p的特定值我看到了!

这个值: 0xFF00000000是否有任何特殊含义?

相反 – 指针在free保留其值。

C标准说,一旦对象free d或者更一般地说,它的生命周期结束,指向对象的所有指针的值变得不确定 ,并且使用这样的不确定值可能导致未定义的行为,即使它只是打印价值。 它恰好看起来好像保留了原来的价值,但绝不保证。

这允许C编译器在您的函数中进行优化。 例如,如果它使用一个CPU寄存器来保留p的值,则在free(p)调用之后,编译器知道寄存器现在可以用于其他内容,例如存储其他操作的中间计算结果,以及在为其分配新值之前,不需要存储其值。


至于两个不同对象的内存地址是相同的 – 如果它们不同时存活则是可能的。 单个对象的整个生命周期将具有一个常量地址。 在其生命周期之后发生的事情是未指定的。 malloc通常被实现为空闲块的列表,并且最近free d块可能首先被重用。

后来我在其他地方释放了指针? 确保仅在为其分配动态内存地址时释放p ,否则会导致未定义的行为。

 p = NULL; /* now it's points to NULL */ p = malloc(SIZE); /* malloc() may give same previews memory location or may not */ 

C标准,6.2.4节

对象的生命周期是程序执行的一部分,在此期间保证为其保留存储。 存在一个对象,具有一个常量地址,并在其整个生命周期内保留其最后存储的值。 如果在其生命周期之外引用对象,则行为未定义。 当指针指向(或刚刚过去)的对象到达其生命周期的末尾时,指针的值变得不确定。

我不能指望保留与现在用于其他东西的价值相同的价值?

你不能强迫malloc()在释放后不返回相同的旧内存地址。 释放的内存不再属于您的程序,下次当您的进程再次尝试分配内存时, malloc()可能会返回相同的地址(不是值)或者可能不会。