gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:26 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com