在这种情况下,了解悬空指针行为
我有一个指针,默认情况下它携带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()
可能会返回相同的地址(不是值)或者可能不会。