字节寻址存储器(数据对齐)

时间:2015-11-01 14:07:30

标签: c memory memory-management data-structures ia-32

我不想让你做我的作业。我只是想要一些关于如何做到这一点的提示,以便我自己学习。

给定的是一个字节寻址的存储器,它从最低地址写入最高地址。然后我有一个C程序,它有以下声明:

long int i = 1;
char c = 'x';
short int n = 10;
short in m = 11;
float f = 0.0;

在IA32中,Int是4个字节,char是1个字节,short是2个字节,float是4个字节。如何将这些声明最有可能保存在内存中?以十六进制数字填写以下内容。

enter image description here

我如何从这里开始?你能给我一些提示吗?我要做的第一件事是什么?

编辑:我的朋友告诉我系统是IA32。

2 个答案:

答案 0 :(得分:3)

  

只想了解如何做到这一点,以便我自己学习。

  1. 编写一个实现相关定义的程序。
  2. 使用符号编译它。
  3. 在调试器中运行它并检查相关变量的地址。
  4. 作为上述步骤2和3的替代方法,您可以使用以下方式打印出地址:

    printf("myvar's address=%p", (void*) &myvar);
    

答案 1 :(得分:2)

我假设您的变量被声明并定义为本地(非静态/全局)变量,例如:

int main()
{
    long int i = 1;
    char c = 'x';
    short int n = 10;
    short in m = 11;
    float f = 0.0;
}

如果是,则将它们分配到堆栈中。

在堆栈上分配局部变量的原则对于所有系统大致相同:

  1. 堆栈从高地址增长到低地址
  2. 程序中变量声明的顺序对应堆栈的增长
  3. 每种类型都有对齐 - 任何变量的地址必须可以被大小整除(char为1,short为2,等等)
  4. 尽可能少浪费空间
  5. 原则(2)和(4)之间存在冲突 - 如果重新排列变量可以节省空间,编译器会这样做吗?我想你可以假设没有(这是你问题中“最有可能”的部分)。

    真实情况比这复杂得多(sizeof并未真正由上述数字规定;对齐要求并不总是等于sizeof;编译器可能会为两个不同的变量重用空间;等等) - 但如果你想在合理的时间内解决你的家庭作业,你必须简化它。