C++ stack overflow

C++运行窗口时出现如下图标

请问是什么原因? 我的程序中有int p[2097152]; int s[2097152][21],这种变量,是不是变量占用空间太大了?我怎么解决?因为我确实需要那么多的数组空间。求教怎么解决这个问题才能使程序运行,在线等,加分

第1个回答  2014-04-09
从堆上申请内存空间,比如C语言使用malloc()申请
C++也可以使用 int *p = new int[2097152*21];这样来申请内存空间
但是从堆上分配的要自己释放
malloc()和free()
new 和 delete 配合使用
申请内存之后,要检查指针看是否申请成功追问

可以更具体点么,我该怎么替换int p[2097152]; int s[2097152][21],

追答

替换的话
int *p = new int[2097152];
int (*s)[21] = new int[2097152][21];

在p跟s生存周期结束的时候也就是定义的大括号结束之前
delete[] p;
delete[] s;

追问

编译这句话时出现,error C2440: '=' : cannot convert from 'int (*)[21]' to 'int *',什么意思

追答

我刚刚写错了
二维数组使用
int (*s)[21] = new int[2097152][21];

delete 也改成 delete[]

追问

我不用delete 释放内存有什么后果?

追答

如果不释放,指针本身是创建在程序栈空间的,在生命周期结束时,p自身被释放,而它指向的堆空间没有被释放,不能再次被申请,也无法再释放,成为一块不可用的内存,也就是经常说的内存泄漏

第2个回答  2014-04-09
在Windows系统中,如果不另外指定堆栈只有几兆。不要说这么大的数组,就算是几百字节的结构体也非常不推荐放在堆栈里。不过理解这些需要你使用C语言的时间更长一些。
第3个回答  2014-04-09
说明你赋值的时候数组越界了,比如
int a[4];
a[5] = 0;
这样就是越界,好好检查一下你的程序逻辑追问

我逻辑感觉没问题,是不是数组太大int p[2097152]的问题,怎么解决啊,能提供个解决方案么,我感觉我没有越界啊

追答

好吧我试了一下,确实太大了,报一样的错
你为什么需要这么大的数组?

追问

把一大堆数据放进去啊,难道分组放可以解决这个问题?我是C++新手不太懂

追答

如果非要那么大的内存,那就
int p * = (int*)malloc(2097152*4);
int s ** = (int*)malloc(2097152*4);
for(int i=0;i<2097152;i++)
{
s[i] = (int*)malloc(21*4);

}
用法跟数组一样

把一大堆数据放进去这个想法,作为一个程序员一般都是要避免的,根据情况想出其他办法吧

相似回答