我正在尝试使用指针。看看这段代码:
#include <stdio.h>
int main() {
int numba = 1;
int *otherintptr = &numba;
printf("%d\n", otherintptr);
printf("%d\n", *otherintptr);
*otherintptr++;
printf("%d\n", otherintptr);
printf("%d\n", *otherintptr);
return 0;
}
输出结果为:
2358852
1
2358856
2358856
现在,我很清楚(*otherintptr)++
会增加我的int,但我的问题不是这个。
增量后,内存位置正确增加4个字节,即整数的大小。
我想知道为什么最后一条printf指令打印内存位置,而我明确要求打印内容标记为 2358856 的内存位置(我是期待一些肮脏的随机内容)。
请注意,第二个printf
语句按预期打印内存单元格 2358852 的内容(整数1
)。
答案 0 :(得分:6)
这两行会发生什么
int numba = 1;
int *otherintptr = &numba;
由于C编译器将生成顺序内存布局,otherintptr
最初将指向与numba
变量对应的内存地址。这与调用main
时分配的堆栈帧有关。
现在,堆栈上的下一个位置(实际上是前一个位置,如果我们认为堆栈在基于x86的架构上逐渐减少)被otherintptr
变量占用。递增otherintptr
会使其指向自身,因此您会看到相同的值。
举个例子,我们假设main
的堆栈从内存中的0x20偏移量开始:
0x20: 0x1 #numba variable
0x24: 0x20 #otherintptr variable pointing to numa
执行otherintptr++
指令后,内存布局如下所示:
0x20: 0x1 #numba variable
0x24: 0x24 #otherintptr variable now pointing to itself
这就是第二个printf
具有相同输出的原因。
答案 1 :(得分:4)
当您otherintptr++
时,您不小心让otherintptr
指向otherintptr
,即指向自己。 otherintptr
恰好在numba
之后立即存储在内存中。
无论如何,你在这里好几次幸运。使用int *
指针访问非int
且与int
不兼容的内容是违法的。使用%d
打印指针值是违法的。
答案 2 :(得分:-2)
我想你想将整数otherpointer
增加到(numba
)。但是,您实际上增加了指针,因为++
比*
更强。
see here
所以otherpointer
指向变量。由于没有有效变量,因此取消引用指针是未定义的行为。因此,任何事情都可能发生,你只是幸运的是程序没有崩溃。它偶然发生otherpointer
本身就在那个地址。