问题描述
- 二维数组大小问题......
-
int a[100][100] = { 0 }, b[100] = {0}, n, m, j, i, min;
printf("输入行和列: ");
scanf_s("%d%d", &n, &m);
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
scanf_s("%d", &a[i][j]);
for (i = 1; i <= m; i++)
{
min = a[1][i];
for (j = 1; j <= n; j++)
{if (a[j][i] < min) min = a[j][i]; } b[i] = min; } for (i = 1; i <= m; i++) printf("%d", b[i]);//这个程序求二维数组每一列的最小值,但是我把a[100][100]改成a[1000][1000] 把b[100]改成b[1000]的话,这个程序就不能运行了,运行时会提示出现了某个错误,怎么回事啊?
解决方案
stack的大小是有限的,改用malloc分配数组空间。
解决方案二:
数组太大,栈溢出了。
解决方案三:
可以在堆里分配,试试看咯
解决方案四:
数组太大,可以考虑将数组开在全局变量那里,算法竞赛书上有这样的例题
解决方案五:
1、数组下标是从0开始,例如int a[3];其包含元素为 a[0],a[1],a[2],不包含a[3],如果您使用a[3]就会产生内存溢出
2、在操作数据时,循环一般也是从0开始,如:for(int i=0;i<3;i++){.....};此次循环中不能让i=3,否则就出现a[3],会产生内存溢出
3、对于上面几位的回答,说数组太大这个问题,表示不赞同。
4、关于你说的100改成1000就有问题,如果你把1、2两点看明白,修改了,如果还有问题,请重新贴源码,有空帮您看看
解决方案六:
a[100][100],表示数组的数据大小为100 * 100<65535,也即64k,由于你编写的是默认的dos下的小模式程序,数据不能超过64k,即65535,
a[1000][1000] 它的数据大水为1000 * 1000 达到了一百万,显然大于64k,在dos模式下显然不能运行,如果在windows的平坦内存flat模式下
是可以使用4GB内存的,那样就没有问题了,如果你一定要用如此大的数据,则可以考虑用windows编程模块加载,可用vc++,或windows下的C组件。
解决方案七:
1、正如荒村归来所说,数组遍历中下标的控制应该是有点问题。
2、要是数组太大导致栈溢出的话,应该会提示segment fault错误。
如果遇到这种错误,可以使用 ulimit -a 查看stack设置多大,以kbytes为单位;
也可以通过ulimit -s size 修改栈大小的设置,比如 ulimit -s 102400,设置为100M
希望对你有所帮助。
解决方案八:
一般这类似的问题都是栈溢出了。。。
解决方案九:
运行时会提示某个错误???运行时直接就提示了栈溢出:
有未经处理的异常: 0xC00000FD: Stack overflow