c - 访问内存地址后无法访问指针中的值
问题描述
实际上,我正在浏览 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。任何帮助将不胜感激。
解决方案
在int* create_an_integer(int value)
中,参数value
是调用函数时自动创建的临时对象。此对象包含传递值的副本,3
。但是,它的内存仅在函数执行期间保留。当函数返回时,内存不再保留,可以重新用于其他目的。
尝试使用该内存可能会或可能不会产生3
以前存在的值,这取决于内存是否已被重用和其他因素。它可能仍然包含的事实3
是为什么您的程序可能会在某些代码排列中输出“3”而不是其他代码排列。这种行为是不可靠的。
此外,当对象不再存在时(当不再为它保留内存时),自动对象的地址将变得无效。也就是说,地址本身不是 C 模型中的有效值,不应使用。所以函数不应该返回自动对象的地址,调用例程也不应该使用这样的地址。
推荐阅读
- c# - 如何通过“验证来电显示”值在 AD 中查找计算机
- spring - Cassandra 配置未初始化
- jquery - 当标题是{{变量}}时,如何使用Jquery从表中获取(标题)文本
- php - 在索引中包含标题?
- android - 通过 Flutter 中其他类的按钮单击调用类的 setState() 方法
- angular - 找不到Angular 7自定义管道
- go - TestMain - 没有要运行的测试
- javascript - 将 AJAX 数据传递和检索到控制器
- python - 如何将 pandas MultiIndex DataFrame 转换为 3D 数组
- ruby-on-rails - 如何在 Mac 上使用 Sqlite3 运行 rails?我收到“未加载 gem”,但它包含在 Gemfile 中