访问存储器地址后无法访问指针中的值

时间:2020-06-26 21:19:25

标签: c pointers memory

我实际上正在浏览一些示例代码,这些代码演示了Kamran Amani的书 Extreme C 中的指针。我编辑了示例,并产生了如下所示的代码:

#include <stdio.h>
#include <stdlib.h>

int* create_an_integer(int value){
    int* var = (int*)malloc(sizeof(int));
    printf("Memory Address of value: %p\n", &value);
    var = &value;
    printf("Memory Address of var: %p\n", var);
    printf("Value at Memory Address of var: %d\n", *var);
    return var;
}
int main(void) {
    int* ptr = create_an_integer(3);
    printf("\n\n");
    printf("Memory Address of ptr: %p\n", ptr);
    printf("Value at the memory address returned: %d\n", *ptr);
    free(ptr);
    return EXIT_SUCCESS;
}

当代码正在执行并尝试显示ptr的内存地址和该ptr的内存地址处的值时,它将正确显示内存地址,但不会显示正确的值。但是,有趣的是,如果我省略行printf("Memory Address of ptr: %p\n", ptr);,重新生成代码,然后再次运行它,它将正确显示ptr的内存地址中的值,在这种情况下应为3。任何帮助都会不胜感激。

1 个答案:

答案 0 :(得分:1)

int* create_an_integer(int value)中,参数value是一个临时对象,在调用函数时会自动创建。该对象包含传递的值3的副本。但是,仅在函数执行期间保留该存储器。函数返回后,不再保留内存,可以将其重新用于其他目的。

尝试使用该内存可能会或可能不会产生先前存在的3值,这取决于内存是否已被重用以及其他因素。它可能仍然包含3的事实,这就是为什么您的程序可能在某些代码排列而不是其他代码排列中输出“ 3”的原因。这种行为是不可靠的。

此外,当该对象停止存在时(当不再为它保留内存时),该自动对象的地址将变为无效。也就是说,地址本身在C模型中不是有效值,因此不应使用。因此,函数永远不要返回自动对象的地址,并且调用例程永远不要使用这样的地址。