一、检查以下代码的问题,并进行修改
int a[20][650][1000],i,j,k;
for (i = 0; i < 20; i++)
for (j = 0; j < 650; j++)
for (k = 0; k < 1000; k++)
a[i][j][k] = 0;
出错信息:0xC00000FD: Stack overflow (参数: 0x00000000, 0x00E42000)。
即栈溢出,通常来说,栈的大小为1024K bytes=1024x1024 bytes。上面那个数组的大小=20x650x1000x4 bytes。可见,数组的大小已经超过了栈的大小。所以会出现栈溢出这种现象。
二、解决办法
1、改变栈的大小
在visual studio中修改栈的大小:
项目->属性->链接器->系统。如下图所示:
在下方的方框中我们可以看到默认值是1MB,我们将之修改为6000000,注意,单位是bytes。
再次实验:
(1)当数组大小小于设置栈大小,数组占用bytes=25121000*4=4096000<6000000。
int a[2][512][1000],i,j,k;
for (i = 0; i < 2; i++)
for (j = 0; j < 512; j++)
for (k = 0; k < 1000; k++)
a[i][j][k] = 0;
再次编译,没有错误。
(2)当数组大小大于设置栈大小,数组占用bytes=35121000*4=6144000>6000000。
int a[3][512][1000],i,j,k;
for (i = 0; i < 3; i++)
for (j = 0; j < 512; j++)
for (k = 0; k < 1000; k++)
a[i][j][k] = 0;
再次编译,出错:Stack overflow
2、不使用栈,而使用堆
修改方法:
int ***p, i, j, k;
p =(int ***) malloc(sizeof(int)*20);
for (i = 0; i < 20; i++)
{
p[i] = (int **)malloc(sizeof(int) * 650);
for (j = 0; j < 650; j++)
{
p[i][j] = (int*)malloc(sizeof(int) * 1000);
for (k = 0; k < 1000; k++)
{
p[i][j][k] = 0;
}
}
}