gpt4 book ai didi

c - 为什么使用 printf 打印变量的地址会改变地址

转载 作者:行者123 更新时间:2023-11-30 21:32:36 25 4
gpt4 key购买 nike

代码1

#include <stdio.h>
int main()
{
int n[] = {0};
int i = 1;
n[0] = i; //making sure the variable is used
n[-1] = 20; //i's offset when &i is printed
printf("%d\n", &i);
printf("%d\n", i);
return 0;
}

输出1

2686744
20

代码2

#include <stdio.h>
int main()
{
int n[] = {0};
int i = 1;
n[0] = i; //making sure the variable is used
n[1] = 20; //i's offset when &i isn't printed
printf("%d\n", i);
return 0;
}

输出2

20

如果我在打印时使用 1 作为偏移量,在不打印时使用 -1,则不会发生覆盖。我尝试打印其他地址和值,但没有发生更多情况。

我相信它与 i 变量的使用与否无关,因为我尝试添加一些代码让编译器认为它已使用。

还尝试在不进行优化的情况下进行显式编译(-O0),而不会更改结果。

最佳答案

使用像 int n[] = {0}; 这样的定义,数组中只有一个元素,即 n[0] 是唯一的有效访问。

在您的第一个代码中,

 n[-1] = 20;

内存访问无效。

在你的第二个代码中,

n[1] = 20;

访问内存过多。这两种情况都会调用 undefined behavior .

此外,要打印地址,您需要使用 %p 格式说明符并将参数转换为 (void *)

关于c - 为什么使用 printf 打印变量的地址会改变地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33969155/

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