假设我有以下计划。内存的哪一部分是a
分配的? c
和c++
的行为也一样吗?
// a is allocated in the ?
int a[3] = {1, 2, 3};
int main()
{
// x is allocated in the stack
int x[3] = {4, 5, 6}
// y is allocated in the heap
int* y = malloc(sizeof(int)*3);
}
答案 0 :(得分:2)
分配它们取决于您的机器体系结构以及您的编译器和链接器实现(两者都没有指定)。 C ++语言标准在这个问题上无话可说。
答案 1 :(得分:1)
在静态存储中,使用标准说话。它并没有真正说明应该如何实现静态存储,除了它应该在程序的整个时间内持续下去,并且如果没有非零,它应该被隐式零初始化给出了初始化程序。
实际上在ELF二进制文件中,这些变量都被连接成各个部分,这些部分在加载时被映射到段上,这些段基本上是具有某些存储器保护位开启或关闭的存储器块。如果全局变量是可写的并且使用非零值初始化,则它将进入指定为.data
的ELF部分。 zero
- 初始化变量将进入.bss
(不是二进制图像的一部分以节省空间),const
个静态变量将进入.rodata
,这将被映射只读,便于写保护。
您的编译器的binutils(例如nm
或objdump
)可以让您查看(依赖于实现的)详细信息。
答案 2 :(得分:0)
这是一个实现细节,堆栈和堆也是如此。语言C没有这样的概念。如果您的实现使用堆,它可能还使用操作系统提供的二进制格式的段。在这种情况下,静态变量放在data
或bss
段中,因此它们既可以是程序本身(数据)的一部分,也可以在加载程序时由OS分配(bss)。
一种常见的方法是将默认初始化变量放在bss
中,因为这样,它们不会增加可执行文件的大小。对于常量数据,通常有rodata
段可用,许多C编译器将字符串文字放在那里。
但最重要的是:您不应该关心,因为C没有指定这个,并且有些平台不提供段或堆,...