0

我的机器是一台运行 centos 系统的 32 位 PC,我使用 GCC 编译我的 C 代码。而int变量占用4个字节。所以我写了这样的代码......

    #include "stdio.h"
    int main(){
           int a=1;
           printf("%c",*(&a+1)+65);
           printf("%c",*(&a+2)+65);
           printf("%c",*(&a+3)+65);
    } 

我是这样想的:PC 是 32 位的,所以变量 a 应该像这样存储在内存中:

   &a    00000001
   &a+1  00000000
   &a+2  00000000
   &a+3  00000000

所以我认为答案应该是:AAA
但真正得到的是:qA(最后一个没有打印出来。)
我确实对结果感到困惑。更重要的是,如果我消化最后两个 printf.which 是:

    #include "stdio.h"
    int main(){
           int a=1;
           printf("%c",*(&a+1)+65);
    }

然后我得到了我想要的:A
我的代码有什么问题或什么;真正的错误是我考虑将变量存储在内存中......请帮我解决这些问题,谢谢。

4

3 回答 3

3

在这里,&a是类型int*,所以&a+1指向下一个 int(之后 4 个字节)。您需要转换&achar*before :((char *) &a) + 1

于 2013-04-18T10:04:51.377 回答
1

当你说“&a+1”并不意味着+1 字节时,它意味着+1 sizeof(int)。

如果您将 &a 转换为 char*,那么您的 +1 将意味着 +1 sizeof(char)。char 的大小为 1 个字节。

于 2013-04-18T10:04:22.117 回答
0

把你的指针&a指向char *这样的指针

printf("%c",*((char*)&a+1)+65);

&a + 1表示您已经a1* size of增加了地址a,a 的大小是 4 byte = 4 * size of char。

将地址a转换为char *指针将允许将地址增加a1 * sizeof char (=1 字节)

于 2013-04-18T10:05:39.533 回答