为什么GCC在不使用变量地址时重新安排内存?

时间:2017-08-25 01:04:13

标签: c gcc

所以我在C中遇到过这个非常奇怪的事情。这是我的源代码:

int i;
char mrn = 'L';
char ref;
char tmp;
char k = 'Z';
char test = 'A';
char test2 = 'B';
for(i=0;i<1024;i++){
    tmp = *(&ref+i);
    if(isprint(tmp)){
        printf("%c", tmp);
    }
}

这只是一个简单的程序,可以在更高内存地址的内存中打印可打印字节。 可以预期只打印'L'。但这并没有发生。它打印出“BAZL”。 但是 当我在这样返回之前访问这些内存地址时

printf("\n");
printf("test2 @ %p\n", &test2);
printf("test @ %p\n", &test);
printf("k @ %p\n", &k);
printf("tmp @ %p\n", &tmp);
printf("ref @ %p\n", &ref);
printf("mrn @ %p\n", &mrn);
printf("i @ %p\n", &i);
printf("\n");

它突然表现得像它应该的那样。因为堆栈向下朝向较低的内存地址增长,所以它仅打印“L”。我明白了,为什么会这样。但是为什么编译器在不使用实际地址时会重新排列内存?

0 个答案:

没有答案