在 linux 中使用 size 命令检查 c 程序的内存布局时出现奇怪的结果
Strange results while checking the memory layout of a c program using size command in linux
当我检查以下 c 程序的内存布局时,使用 linux 中的命令 size program_name
,我得到数据 = 552,bss = 8。
#include <stdio.h>
int main()
{
return 0;
}
现在,在添加一个未初始化的变量后,我仍然得到相同的结果,data = 552,bss = 8。我在这里期望 bss = 12。
#include <stdio.h>
int a;
int main()
{
return 0;
}
如果我添加一个初始化为一个值的变量,我得到我所期望的,data = 556, bss = 12
#include <stdio.h>
int a;
int b = 10;
int main()
{
return 0;
}
但是,如果声明一个指针并使其指向初始化变量,我得到数据 = 568,bss = 8,我不明白为什么。
(对我来说,似乎指针和未初始化的变量都已添加到初始化列表中!)
#include <stdio.h>
int a;
int b = 10;
int * c = &b;
int main()
{
return 0;
}
有人可以澄清这里发生了什么吗?
DATA段保存所有初始化数据。它包含在可执行映像中。由于 b
被初始化为特定值,它包含在数据中(在图像中)。
BSS 段包含所有未初始化的变量。它只是图像中包含的一个数字,加载程序将为它分配内存并将其初始化为零。因此 a
包含在这个数字中(包含在加载时为其分配的字节数)。
c
没有初始化为可以放入DATA段的值。因此它包含在 BSS 段中,但是,在加载时,加载程序必须解析此地址,然后将 c
初始化为 b
在内存中实际放置的位置。
注意:由于此策略,a
和 b
在内存中不连续。这会使调试内存问题变得更加困难。程序的调试版本可能会使它们连续以便能够调试程序。
当我检查以下 c 程序的内存布局时,使用 linux 中的命令 size program_name
,我得到数据 = 552,bss = 8。
#include <stdio.h>
int main()
{
return 0;
}
现在,在添加一个未初始化的变量后,我仍然得到相同的结果,data = 552,bss = 8。我在这里期望 bss = 12。
#include <stdio.h>
int a;
int main()
{
return 0;
}
如果我添加一个初始化为一个值的变量,我得到我所期望的,data = 556, bss = 12
#include <stdio.h>
int a;
int b = 10;
int main()
{
return 0;
}
但是,如果声明一个指针并使其指向初始化变量,我得到数据 = 568,bss = 8,我不明白为什么。 (对我来说,似乎指针和未初始化的变量都已添加到初始化列表中!)
#include <stdio.h>
int a;
int b = 10;
int * c = &b;
int main()
{
return 0;
}
有人可以澄清这里发生了什么吗?
DATA段保存所有初始化数据。它包含在可执行映像中。由于 b
被初始化为特定值,它包含在数据中(在图像中)。
BSS 段包含所有未初始化的变量。它只是图像中包含的一个数字,加载程序将为它分配内存并将其初始化为零。因此 a
包含在这个数字中(包含在加载时为其分配的字节数)。
c
没有初始化为可以放入DATA段的值。因此它包含在 BSS 段中,但是,在加载时,加载程序必须解析此地址,然后将 c
初始化为 b
在内存中实际放置的位置。
注意:由于此策略,a
和 b
在内存中不连续。这会使调试内存问题变得更加困难。程序的调试版本可能会使它们连续以便能够调试程序。