gpt4 book ai didi

C 指针 - 从绝对地址读取值与 AddressOf 运算符 (&)

转载 作者:行者123 更新时间:2023-11-30 14:41:37 25 4
gpt4 key购买 nike

如果我没有编译代码,我会说 12 给出相同的结果,因为它们都有一个 int指针p指向变量age。在 12 中取消引用 age 应该会得到相同的结果。我还知道 3 只会给我变量 age 的第一个字节,因为它的类型为 char。我无法解释为什么 12 给出不同的结果以及为什么 23 给出相同的结果。

1

int age = 20;
int* p = (int *)0x66FC9C;
printf("You're : %d\n", *p );

2

int age = 20;
int *p = &age;
printf("You're : %d\n", *p );

3

int age = 20;
char* p = (char *)0x66FC9C;
printf("You're %d\n", *p );
<小时/>

后续

这很奇怪,因为当我这样做时:

int age1 = 20;
int age2 = 19;
int* p = &age2;
printf("You're %d %d %d %d\n", *p, *(p+1), &age1, &age2 );

enter image description here

实际上,我打印地址,我总是得到p+1正确的地址(意味着我可以预测地址),但如果我这样做:

int age1 = 20;
int age2 = 19;
int* p = &age2;
printf("You're %d %d\n", *p, *(p+1) );

enter image description here

我永远猜不到。就像 C 知道正在被监视一样...咳咳双缝实验

最佳答案

你试图欺骗编译器,它看起来比你聪明......

更严重的是,除非您真的了解编译器的内部结构,否则永远不要尝试猜测它将如何翻译您的源代码。通常,在最后一个示例中,编译器可以轻松地看到 age1 变量从未被使用(至少从未以一致的方式使用)。所以它可以优化它。如果您确实想更好地了解这里发生的情况,则必须要求编译器生成其内部生成的汇编语言,并阅读它。您将看到某个变量是否已被优化(因为它没有生成),或者它是否与另一个变量不连续。

无论如何,尝试更好地理解编译器的作用是很好的,但请永远不要在生产代码中这样做。

关于C 指针 - 从绝对地址读取值与 AddressOf 运算符 (&),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54851778/

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