【发布时间】:2021-07-01 05:47:15
【问题描述】:
我一直在尝试理解指针,特别是指针[i] 表示法,它相当于 *(pointer + i),即取消引用下一个地址的值,所以如果它是一个 int 指针而不是下一个4 字节地址。我尝试在下面运行以下代码:
#include <stdio.h>
int main(void){
int x = 10;
int y = 20;
int* z = &y;
printf("address of x: %u ", &x);
printf("address of y: %u", &y);
printf("value at address: %u \n", *(z+1));
}
我注意到 'y' 在 'x' 之前存储了 4 个字节,并认为我可以通过 z[1] 或 *(z+1) 返回存储在 x 地址的值,这很好。
但是,当我删除前 2 个 printf 时,我最终输出的是地址而不是实际值 (10),以下是此案例的代码:
#include <stdio.h>
int main(void){
int x = 10;
int y = 20;
int* z = &y;
printf("value at address: %u \n", *(z+1));
}
我假设 *(z+1) 不再指代与变量 'x' 相同的内存区域,但我很困惑为什么代码中的这种更改会导致这种情况。
一开始我以为是一次性的,所以我尝试了多次,每次都得到相同的结果。
更令人困惑的是代码如何在 ubuntu 和 macos 上按预期工作,但在 windows 上却没有。
任何有关这方面的帮助都会很棒,谢谢。
【问题讨论】:
-
您是否尝试过使用调试器对这两种情况执行堆栈跟踪?
-
你确定第二个例子中打印的值不只是一些垃圾值吗?
-
可能是这样,但我仍然不知道为什么删除这 2 个打印件会导致这种情况。
-
为什么编译器会浪费内存并保留在您的程序中从未使用过的
x?该变量很可能在您的可执行文件中根本不存在。您还可以通过在printf中使用无效的格式说明符并越界访问内存来调用未定义的行为。 -
打印指针,你必须使用
%p而不是%u
标签: c pointers memory-address