0

我有一个指针,默认情况下它带有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是否呈现任何特殊含义?

4

2 回答 2

3

相反 - 指针在之后保留其值free

C 标准说,一旦对象是freed 或更一般地说,它的生命周期结束,指向该对象的所有指针的值就会变为indeterminate,并且使用这种不确定的值会导致未定义的行为,即使它只是打印价值。它碰巧看起来好像保留了其原始价值,这是无法保证的。

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


至于两个不同对象的内存地址相同 - 如果它们不是同时存在的话,这是可能的。单个对象将在其整个生命周期内拥有一个常量地址。未指定其生命周期后会发生什么。malloc通常实现为空闲块的列表,并且最近的freed 块很可能首先被重用。

于 2018-09-11T05:01:52.323 回答
0

后来我在其他地方释放指针?确保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()可能会返回相同的地址(不是值),也可能不会。

于 2018-09-11T05:03:17.813 回答