gpt4 book ai didi

c - 在 linux 中使用 size 命令检查 c 程序的内存布局时出现奇怪的结果

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:54 24 4
gpt4 key购买 nike

当我检查以下 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;
}

但是,如果声明一个指针并使其指向已初始化的变量,我会得到 data = 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 在内存中实际放置的位置。

注意:由于该策略,ab 在内存中不连续。这会使调试内存问题变得更加困难。程序的调试版本可能会使它们连续以便能够调试程序。

关于c - 在 linux 中使用 size 命令检查 c 程序的内存布局时出现奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30192474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com