首页 > 解决方案 > 访问内存地址后无法访问指针中的值

问题描述

实际上,我正在浏览 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。任何帮助将不胜感激。

标签: cpointersmemory

解决方案


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

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

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


推荐阅读