2 crazymonk CrazyMonk 于 2015.05.27 20:16 提问

二维数组大小问题......

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]的话,这个程序就不能运行了,运行时会提示出现了某个错误,怎么回事啊?

9个回答

nswcfd
nswcfd   2015.05.27 21:56
已采纳

stack的大小是有限的,改用malloc分配数组空间。

chenw191
chenw191   2015.05.27 20:26

数组太大,栈溢出了。

CrazyMonk
CrazyMonk 有详细一点的解释说明吗,链接也可以,我大一,C语言都没学完。
2 年多之前 回复
Dove_MrQ
Dove_MrQ   2015.05.27 21:27

可以在堆里分配,试试看咯

xialeichang
xialeichang   2015.05.28 00:12

数组太大,可以考虑将数组开在全局变量那里,算法竞赛书上有这样的例题

huangcunguilai
huangcunguilai   2015.05.28 11:32

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两点看明白,修改了,如果还有问题,请重新贴源码,有空帮您看看

shilong27235
shilong27235   2015.05.28 14:27

a[100][100],表示数组的数据大小为100 * 100<65535,也即64k,由于你编写的是默认的dos下的小模式程序,数据不能超过64k,即65535,
a[1000][1000] 它的数据大水为1000 * 1000 达到了一百万,显然大于64k,在dos模式下显然不能运行,如果在windows的平坦内存flat模式下
是可以使用4GB内存的,那样就没有问题了,如果你一定要用如此大的数据,则可以考虑用windows编程模块加载,可用vc++,或windows下的C组件。

GeorgeBrian
GeorgeBrian   2015.05.28 14:54

1、正如荒村归来所说,数组遍历中下标的控制应该是有点问题。
2、要是数组太大导致栈溢出的话,应该会提示segment fault错误。
如果遇到这种错误,可以使用 ulimit -a 查看stack设置多大,以kbytes为单位;
也可以通过ulimit -s size 修改栈大小的设置,比如 ulimit -s 102400,设置为100M
希望对你有所帮助。

u012377333
u012377333   Rxr 2015.05.28 18:44

一般这类似的问题都是栈溢出了。。。

u010973206
u010973206   2015.05.29 14:17

运行时会提示某个错误???运行时直接就提示了栈溢出:
有未经处理的异常: 0xC00000FD: Stack overflow

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!