gpt4 book ai didi

c - C 中奇怪的指针行为

转载 作者:行者123 更新时间:2023-12-02 06:56:41 24 4
gpt4 key购买 nike

我正在试验指针。看这段代码:

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

最佳答案

这两行会发生什么

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 具有相同输出的原因。

关于c - C 中奇怪的指针行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29835843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com