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

标签 c linux size

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

相关文章:

c - 有谁知道这个 "typedef long long int (stoll_t)(const char *, char **, int);"是什么?

linux - WebDriverException : Message: unknown error: cannot process extension #1 from unknown error: CRX verification failed: 3

python - 无法打开 40 针接头上的 UART

java - 让 JPanel 变得更大

c - 在没有 "error C2124: divide or mod by zero"的可移植 C 中定义 NaN

c - 接受的套接字上的“错误文件描述符”错误

c - 获取由 CreateProcess() 启动的进程的 PID

linux - 在我的配置文件中增加我的服务器端口

c++ - std::vector.size() 不工作

javascript - 如何在 100% 缩放时获取 DIV 的大小?