C语言中,关于二维数组的输入问题。

为什么上面的代码编译后可以正常运行,下面的编译后运行是会出现错误?
两段代码差别为:第一段代码的第六行 和 第二段代码的第23行

上面能运行下面报错?不可能吧
数组是在栈空间上分配的,C默认不支持动态数组,所以如果你使用rule_num作为数组的下标定义一个数组是会报错的。如果希望使用变长数组,可以采用malloc动态分配。
另外,标准的C语言程序要求将所有的变量都定义在函数的开头,也就是说你将char型数组写在while循环中这一个写法本身也是有问题的。能够编译通过可能因为你是用的是C++编译器。
另外,VC默认的栈为1M,1个char类型变量需要1B的空间,10000^2需要95M,所以栈溢出也是有可能的。追问

编译器是gcc
您说的标准是C89还是C99,我记得可以在{}里声明变量
Variable Scope
•Refers to where variables can be referenced
•Global scope
•A variable declared outside any blocks/functions
•is available anywhere after its declaration
•Local scope
•A variable declared within a block
•is only available in the block, after its declaration.

追答

具体是什么标准我就不太清楚了。
我使用gcc不多,大部分用vc进行编译。不过gcc和vc的差异还是蛮大的。比如你所用的动态数组的问题,前两台我用xcode编码的时候发现竟然支持动态数组,很诧异,但是vs2012就不支持。
不过一般来讲大家都认为gcc是最标准的C语言编译器。

至于标准的具体内容,我没有深究过。你如果想要研究的话可以参阅以下标准。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-05
首先,你第一个“动态分配”好像就是错的,c语言不支持栈的数组动态分配。

栈的大小的问题。
栈的大小,根据编译器不同而不同
一般来说也就几M。
1M=1024k=1048576字节,不知道你编译器设置的栈是多大,10000*10000又是多大呢。

所以你的rule_num如果太大的话很容易出问题,最好在堆里分配,malloc。

不过栈的大小一般都可以调节,编译器不一样,调节不一样
第2个回答  2012-12-05
rule_num是由用户输入指定的,但是你指定的数组的行数为10000,如果输入的rule_num的值大于10000,则会产生错误。
相似回答