c - 了解这种情况下的悬挂指针行为

标签 c pointers dangling-pointer

我有一个指针,默认情况下它携带 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

编辑:我已经知道这不是我们应该怎么做,我不能期望保留与现在可能用于其他东西相同的值(value),但我想要的要知道的是为什么我只能看到 p 的特定值!

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

最佳答案

相反 - 指针释放后保留其值。

C 标准规定,一旦对象空闲,或者更一般地说,它的生命周期结束,指向该对象的所有指针的值就会变得不确定 ,并且使用这样一个不确定的值可能会导致未定义的行为,即使它只是打印该值。它碰巧看起来好像保留了原来的值(value),这并不能保证。

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


至于两个不同对象的内存地址是否相同——如果它们不同时处于事件状态,那是有可能的。单个对象将在其整个生命周期内拥有一个不变的地址。未指定其生命周期后发生的情况。 malloc 通常作为空闲 block 列表来实现,最近的空闲 block 很可能首先被重用。

关于c - 了解这种情况下的悬挂指针行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52268868/

相关文章:

无法解决此错误 : mutex in c and the lock problems

比较内联 c 汇编中的数字

c++ - 函数指针的取消引用是如何发生的?

c++ - 阐明 C/C++ 中的悬挂指针

c - 为什么下面两个代码提供不同的结果?

c++ - 如何使用 dlmopen 在不同线程中打开多个共享库?

c++ - valgrind 使用 --trace-children=yes 得到的结果不正确

c - 在 C 中取消引用指向不完整类型的指针

c - 无法从函数中释放指针

c++ - 从函数返回对数据的引用会导致悬空引用问题