我的机器是32位PC运行centos系统,我使用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 shoule存储在内存中,如下所示:
&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 我的代码有什么问题或者是什么;真正的错误是我在存储器中存储变量的想法...请帮我解决问题,谢谢。
答案 0 :(得分:3)
此处,&a
的类型为int*
,因此&a+1
指向下一个int(后面的4个字节)。您需要在&a
char*
转换为((char *) &a) + 1
答案 1 :(得分:1)
当你说“& a + 1”并不意味着+1字节时,它意味着+1 sizeof(int)。
如果你将& a转换为char *,那么你的+1意味着+1 sizeof(char)。 char的大小为1个字节。
答案 2 :(得分:0)
将指针&a
投射到char *
指针,就像这样
printf("%c",*((char*)&a+1)+65);
&a + 1
表示您已将a
的地址增加1
*大小为a
,且a的大小为4字节= 4 *字符大小的char。
将a
的地址转换为char *
指针将允许使用1 * sizeof char(= 1字节)递增a
的地址