C中的奇怪指针行为

时间:2015-04-23 23:01:31

标签: c pointers

我正在尝试使用指针。看看这段代码:

#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)。

3 个答案:

答案 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本身就在那个地址。