【发布时间】:2023-01-12 06:31:51
【问题描述】:
为什么我可以编译运行这段代码?数组是不是太大了?内存是如何分配给这个数组的?
#include <iostream>
#define Nbig 10000000000000000
int main() {
int x[Nbig];
x[Nbig-1]=100;
std::cout <<"x[Nbig-1]= "<< x[Nbig-1] <<"\n\n";
return 0;
}
我认为当声明一个静态数组时,应该为其分配一块 RAM,当我分配一个值来表示 x[1000] 时,'x+1000*4' 地址处的内存字节(4 用于 int 和 x第一个元素的地址)应该表示值。我尝试使用谷歌搜索并阅读有关静态和动态分配、堆和堆栈、RAM 本身的内容,但没有在任何地方找到我的答案。可能有帮助的其他信息:我正在使用具有 32GB RAM 的 linux,并使用 gcc 编译代码。
【问题讨论】:
-
MSVC 它不会编译。在 GCC 中,使用
-O1它只是完全删除数组并打印100;-O0没有运行。 -
此代码中没有静态数组。您缺少关键字
static。 -
你应该尝试输出
sizeof(x) / sizeof(x[0]);。它是否等于您作为#define拥有的号码? -
我试过并得到了这个: sizeof(x[0])= 4 sizeof(x)= 40000000000000000 @PaulMcKenzie
-
你能详细说明一下吗?即使数组是动态的(或其他),程序不应该仍然按照我解释的方式分配内存吗? @Elijay