【发布时间】:2017-01-18 16:33:11
【问题描述】:
谁能解释为什么打印指向两个整数的指针会导致它们被放置在与字符相关的不同位置。
下面的代码应该打印出从 &a 到 &c 的内存地址(我认为)应该包括定义的两个整数,但它没有,但是当我试图找出它们在内存中的存储位置时(请参阅第二个代码段)它确实按预期在两个字符之间打印它们。
请解释为什么打印 int 指针会影响 int 存储在内存中的字符之间。
这两个代码示例是相同的,只是代码 2 有一个额外的行 printf("\n\n%p,%p\n",&i,&j); 打印两个整数的指针。
编辑:是的,我知道 prinf 格式很难看,但代码只是为了帮助我澄清内存和指针的工作原理,所以我不需要它漂亮
代码1
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv){
char a='a';
int i=1;
int j=2;
char c='c';
char *pos;
for ( pos=&c; pos<=&a; pos++ ){
printf("%p\t",pos);
}
printf("\n");
for ( pos=&c; pos<=&a; pos++ ){
printf("%i\t\t",*pos);
}
}
代码 1 的结果
0x7ffde6321e7e 0x7ffde6321e7f
99 97
代码2
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv){
char a='a';
int i=1;
int j=2;
char c='c';
char *pos;
for ( pos=&c; pos<=&a; pos++ ){
printf("%p\t",pos);
}
printf("\n");
for ( pos=&c; pos<=&a; pos++ ){
printf("%i\t\t",*pos);
}
printf("\n\n%p,%p\n",&i,&j);
}
Code2 的结果
0x7ffc3575616b 0x7ffc3575616c 0x7ffc3575616d 0x7ffc3575616e 0x7ffc3575616f 0x7ffc35756170 0x7ffc35756171 0x7ffc35756172 0x7ffc35756173 0x7ffc35756174 0x7ffc35756175 0x7ffc35756176 0x7ffc35756177
99 2 0 0 0 1 0 0 0 -4 127 0 97
0x7ffc35756170,0x7ffc3575616c
【问题讨论】:
-
第一个程序从不使用
i和j,所以编译器直接忽略了它们。 -
两者都是未定义的行为。
-
尝试将您的程序编译为汇编代码,您会看到@Barmar 所说的:第一个程序只是有 no
intvarablesi和j– 编译器发现它们未被引用,因此没有必要,并删除它们。