繁体   English   中英

如何根据变量的类型将变量存储在C中的内存中

[英]How variables get stored in memory in C, According to their types

因此,我试图了解C如何将我的变量存储在内存中,并且在遇到这个问题之前,我一直做得很好:

我写了下面的简单程序,告诉我变量在哪里被逐一存储,这样我就可以知道类型之间的区别,但是我无法使任何链接的数量看起来如此任意,同时我相信它必须做类型。 那么,有什么线索可以解释为什么即使最后声明了字符,字符也总是会得到较低的内存地址?

int main ()
{
    int integer1 = 6;
    int integer2 = 2;
    int integer3 = 3;
    char character1 = 'C';
    char character2 = 'B';
    char character3 = 'D';
    char string1[4] = "Hi!";
    char string2[4] = ":D";
    char string3[4] = "ack!";

    printf ("integer1 : %d, at %p\n", integer1, &integer1);
    printf ("integer2 : %d, at %p\n", integer2, &integer2);
    printf ("integer3 : %d, at %p\n", integer3, &integer3);
    printf ("character1 : %c, at %p\n", character1, &character1);
    printf ("character2 : %c, at %p\n", character2, &character2);
    printf ("character3 : %c, at %p\n", character3, &character3);
    printf ("string1 : %s, at %p\n", string1, string1);
    printf ("string2 : %s, at %p\n", string2, string2);
    printf ("string3 : %s, at %p\n", string3, string3);
}

输出:

integer1 : 6, at 0x7ffe40915b40
integer2 : 2, at 0x7ffe40915b44
integer3 : 3, at 0x7ffe40915b48
character1 : C, at 0x7ffe40915b3d
character2 : B, at 0x7ffe40915b3e
character3 : D, at 0x7ffe40915b3f
string1 : Hi!, at 0x7ffe40915b4c
string2 : :D, at 0x7ffe40915b50
string3 : ack!, at 0x7ffe40915b54

编辑:编译器:GCC 7.3.0

内存中变量的顺序是编译器的实现细节。 无法保证其外观。

话虽这么说,看来编译器正在尝试对变量进行布局,以使所有变量都正确对齐而在它们之间没有任何填充,即这样做是为了节省空间。

请记住,您正在处理自动变量。 对于自动变量的实现方式,没有正式的规范,但是在任何系统中,您都可能会发现它们将在堆栈中。

(假设没有优化)

如果查看main()函数(通常为-S选项)的生成代码,则可能会找到类似以下内容的语句

  MOV  SP, BP
  DECL #SOMENUMBER, SP

其中SOMENUMBER是您的主要功能局部变量所需的字节数。

然后,编译器为每个变量分配SP寄存器的偏移量。 看起来像这样:

  1(SP) ; is character1
  2(SP) ; is character2
  3(SP) ; is character3
  4(SP) ; is integer1
  8(SP) ; is integer2
  12(SP) ; is integer3
  16(SP) ; is string1
  20(SP) ; is string2
  24(SP) ; is string3

堆栈通常向下增长,因此较低的变量地址将具有较小的偏移量。

然后,编译器需要初始化堆栈上的每个位置。

编译器的分配器将弄清楚如何执行此映射。 您需要查看GCC代码以弄清楚它为什么走这条路。

投入

 short short1 ;
 long long long1 ;
 char str[] = "12345" ;

可能会给您一些有趣的结果,以了解不同大小如何影响分配器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM