为什么四个大于63000元素的本地数组会导致堆栈溢出
Why do four local arrays larger than 63000 elements result in a stack overflow?
#include<stdio.h>
#include<conio.h>
#define DATA_SIZE 65000
int main()
{
int a[DATA_SIZE],b[DATA_SIZE],c[DATA_SIZE],d[DATA_SIZE];
for(int i=0;i<DATA_SIZE;i++)
{
a[i]=i;
b[i]=i;
c[i]=i;
}
for(int j=0;j<DATA_SIZE;j++)
{
d[i]=a[i]+b[i]+c[i];
}
return 0;
}
这个程序给出一个堆栈溢出错误,如果我将DATA_SIZE
的值增加到63000以上。为什么会发生在这个节目中?
如果我想使用变量i
的值超过20万,我该如何实现?
感谢
您可能正在本地创建那些巨大的数组,因此堆栈空间有限。
有几个选项可供选择:
- 使用
std::vector
或 - 将它们声明为全局或静态或
- 使用
new
和delete
进行动态内存分配
如果使用最后一个选项,请确保通过智能指针而不是原始指针使用RAII。
在大多数系统上,int
的大小为4字节。四个阵列中的每一个都是65000个int
元素,因此使用65000 * sizeof(int) = 260000
字节。这四个数组总共使用了260000 * 4 = 1040000
字节的堆栈空间。这与许多链接器使用的1MB默认堆栈大小非常接近(您可以在项目配置中更改默认堆栈大小(。这就是为什么如果你试图增加数组的大小,就会出现溢出的原因——你确实超过了链接时配置的堆栈大小。
如果您想使用大量内存,请使用堆而不是堆栈:
#include <stdio.h>
#include <conio.h>
#define DATA_SIZE 65000
int main()
{
int *a = new int[DATA_SIZE];
int *b = new int[DATA_SIZE];
int *c = new int[DATA_SIZE];
int *d = new int[DATA_SIZE];
for(int i=0;i<DATA_SIZE;i++)
{
a[i]=i;
b[i]=i;
c[i]=i;
}
for(int j=0;j<DATA_SIZE;j++)
{
d[i]=a[i]+b[i]+c[i];
}
delete[] a;
delete[] b;
delete[] c;
delete[] d;
return 0;
}
然后可以将其更改为使用std::vector
类为您管理堆内存:
#include <stdio.h>
#include <conio.h>
#include <vector>
#define DATA_SIZE 65000
int main()
{
std::vector<int> a(DATA_SIZE);
std::vector<int> b(DATA_SIZE);
std::vector<int> c(DATA_SIZE);
std::vector<int> d(DATA_SIZE);
for(int i=0;i<DATA_SIZE;i++)
{
a[i]=i;
b[i]=i;
c[i]=i;
}
for(int j=0;j<DATA_SIZE;j++)
{
d[i]=a[i]+b[i]+c[i];
}
return 0;
}
在我看来,您向调用堆栈分配的变量太多了。如果您打算拥有这样的巨大数组,我建议您将其分配到堆中。
你可以用指针来做到这一点。
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- C++ 对象数组堆栈溢出
- 将字符数组转换为结构时出现问题. 结构的字符数组变量溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 缓冲区溢出 - 数组索引越界(严重)
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 初始化数组并出现堆栈溢出错误
- 静态数组溢出堆栈(seg 错误 11)仅在类定义内部时,否则不会..?
- 我在 36603 以上输入的任何数组大小时都会返回"堆栈溢出"错误。如何使字符串能够捕获整个.txt文件?
- 标准::数组类上的堆栈溢出
- C++ 3D 数组到 1D 会导致堆缓冲区溢出
- 为什么我的程序一直给我堆缓冲区溢出,即使我没有超出数组的界限或覆盖任何值
- C++堆栈溢出初始化数组
- std::堆栈和堆栈溢出错误的数组分配
- 如果数组是否溢出,则打印
- 数组缓冲区溢出
- c++数组和溢出
- 数组边界溢出
- 通过设置为字符串字面值初始化的c++大小的char数组会导致数组边界溢出