为什么大型本地数组会使我的程序崩溃,而全局数组不会?
Why does a large local array crash my program, but a global one doesn't?
具有大型全局数组的程序:
int ar[2000000];
int main()
{
}
具有大型本地阵列的程序:
int main()
{
int ar[2000000];
}
当我在主函数中声明一个大尺寸的数组时,程序崩溃并显示"SIGSEGV(分段错误)"。
但是,当我将其声明为全局时,一切正常。为什么?
全局声明数组会导致编译器在编译二进制文件的数据部分中包含数组的空间。 在本例中,您将二进制大小增加了 8 MB(2000000 * 每个整数 4 个字节)。 但是,这确实意味着内存始终可用,不需要在堆栈或堆上分配。
编辑:@Blue Moon正确地指出,未初始化的数组很可能会在bss
数据段中分配,实际上可能不占用额外的磁盘空间。初始化的数组将被静态分配。
当您在程序中声明一个如此大的数组时,您可能已经超过了程序的堆栈大小(具有讽刺意味的是,它导致了堆栈溢出)。
动态分配大型数组的更好方法是使用指针并在堆上分配内存,如下所示:
using namespace std;
int main() {
int *ar;
ar = malloc(2000000 * sizeof(int));
if (ar != null) {
// Do something
free(ar);
}
return 0;
}
可以在此处找到有关C程序内存布局的良好教程。
相关文章:
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- C ++程序如何返回我的数组或写入全局变量
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- 为什么我的数组值与此处的全局变量不匹配?
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- 乘以字符串/数组和全局数组
- 初始化与函数输入相关的全局数组
- 有没有办法避免全局数组
- CUDA 全局函数未正确添加某些索引的数组值
- 如何在C++中动态分配全局字符数组中的类实例?
- 如何将全局字符变量值分配给数组?
- 为什么 g++ 不优化局部数组而是优化全局数组?
- 如何在多个文件中声明全局 std::vector 2d 数组?C++
- (C )创建可以从功能访问的动态全局数组/向量
- C++全局常量数组:是否保证合并(优化)到一个副本中
- 使用数组作为全局变量
- 二进制"+=":尝试将对象添加到对象数组时未找到全局运算符
- 二维数组传入没有全局定义 (M x N) 的函数
- 全局数组在 C 代码中添加到头文件时没有"类型"
- C++:如何使数组全局可访问