c语言中数组定义的问题~~!

来源:百度知道 编辑:UC知道 时间:2024/07/05 16:22:44
#include <stdio.h>
void main()
{
int a[100000],b[100000],c[100000];
}
这样定义出错了!

#include <stdio.h>
int a[100000],b[100000],c[100000];
void main()
{
}
这样定义对的!

#include <stdio.h>
void main()
{
int a[100000],b[100000],c[10000];
}
这样定义对的!

#include <stdio.h>
int c[100000];
void main()
{
int a[100000],b[100000];
}
这样是对的!

请明白的人帮忙解释。希望能解释清楚。谢谢!
希望能说出每一种的区别。谢谢~~

负家子弟::你说的那个1036084,好像我没有超过它的大小吧?!

zxkdeem::晕。你要在pku上提交,就不区分,什么编译器了。这个和vs,vc编译器差别没有关系。

主函数内定义的数组在堆栈段中分配内存。
全局变量数组在数据段中分配内存。
一般数据段比堆栈段大很多,
所以堆栈段分配不了的内存,数据段可以分配

(1)在堆栈段中分配内存,由于太大无法分配,所以错误。
(2)在数据段中分配内存,数据段可以分配,无错误。
(3)数组比(1)需要的内存少,在堆栈段大小范围内,可以分配,无错误
(4)同(3)

____________________
| Stack区(数组,指针,结构体,局部变量)
____________________
| Static变量(静态变量,全局变量)
____________________
| Heep区(堆区)
____________________
| 代码段
____________________

一个程序的内存分配是上面那个样子的,因为静态、全局变量是在堆上分配空间的所以可以大一些(有多大就看你的系统和编译器了,你可以分配比你的实际物理内存更大的空间编译不报错,运行就不行了)。
局部变量是分配在栈上的,而栈是堆的一块区域,所以大小是受限的,我在VC6+XP SP3里面试的最大不能超过1036084字节。栈的大小也是跟系统和编译器有关。
自打电脑进入386时代以后所有的段都可以访问到4G内存空间,就是所谓的平坦模式(看看汇编就知道了这部分内容在书的最后几章一般都被忽略了),所以现在关于段的概念是比较模糊的,也不太常用。

你的第一个定义错了是因为超出是1036084(259021*4)这个范围,你定义了300000,第三个是210000,第四个是200000,就对了。堆上的空间就不知道是多大了我试了5*1024*1024结果也没溢出,可能会是个很大的数。

如果用动态分配的办法,就是在堆上分配,就不受这些限制。

第3个和第1个不是一样的么,怎么一个对一个错

在函数内定义的数组,属于auto型变量,占用的是系统栈的空间,而系统栈默认只有1M大小,放不了太大的数组.
函数外定义的数组,属于全局变量