未打印时,可变地址未对齐

时间:2015-11-21 19:41:54

标签: c pointers

我只是想知道C中的内存地址对齐。我让这个程序看到了输出地址。我执行程序时,其中一个printf行启用了测试。

#include "stdio.h"

int main(){
        int number1=1;
        int number2=2;
        int number3=3;
        int number4=4;
        int number5=5;
        printf("number1: %p number5: %p number3: %p number2: %p number4: %p \n",&number1,&number5,&number3,&number2,&number4);
        //printf("number1: %p number5: %p number3: %p  \n",&number1,&number5,&number3);    
}

自行使用第一个printf的结果

  

number1:0x7ffeb26e8abc
  number5:0x7ffeb26e8aac
  number3:0x7ffeb26e8ab4
  number2:0x7ffeb26e8ab8
  number4:0x7ffeb26e8ab0

正如您所看到的,地址中的最后一个字节从第一个变量递减到最后一个变量。它从“bc”到“b8”到“b4”再到“b0”到“ac”。

自行使用第二个printf的结果。

  

number1:0x7ffee620d684
  number5:0x7ffee620d67c
  number3:0x7ffee620d680

您可以看到它从第一个声明的变量number1开始递减地址位置。它从“84”变为“80”到“7c”。

基于第一次printf测试,我认为第二次测试会在打印中显示未对齐的地址。我希望地址按照声明的顺序对齐。

测试2的预期结果。

  • number1地址以84
  • 结尾
  • number2地址以80
  • 结尾
  • number3地址以7c
  • 结尾
  • number4地址以78
  • 结尾
  • number5地址以74
  • 结尾

根据测试2中打印语句的声明,它看起来不像变量number2和number4在地址对齐中。

问题

  1. 为什么只有打印的变量地址对齐?编译器是否表示如果地址已对齐,这些变量将根据其使用情况更好地执行。
  2. 为什么地址会减少?我认为随着它们被放入堆叠,它们会增加吗?从第一个变量地址开始。

1 个答案:

答案 0 :(得分:2)

  1. 堆栈经常向下增长,这些变量在堆栈中。
  2. (a)您的编译器当然可以自由地以任何方式组织这些变量。不要求他们的地址彼此靠近。 (b)在这种情况下,编译器可能只是优化了其他变量,因为它们的值从未使用过。