关于C语言中数组分配内存等问题!额,本人是菜鸟,被一C语言书上的话弄晕了! 如果我的问题有些怪,请见谅

书上说:“C语言是在编译阶段为数组开辟单元的”!
问题:1、定义在一个函数里的数组(auto型),不也是局部变量吗?局部变量不是在函数被调用或说是程序运行到函数时才分配内存的吗? 怎么变成编译时就分配了!
2、全局变量和静态变量是编译时开辟内存,若没有初始化,则程序自动赋零。对数组:若char a[10],这个数组没有赋初值;该数组在编译时是不是只开辟内存,初始化由程序员完成?!
3、“数组分为静态数组(在声明时已经确定子数组大小的数组)和动态数组(在程序执行过程可中改变数组的大小)”—这个是针对C语言来说的吗?那通常在C语言里定义的数组是属于哪种?如:int a[10] —这个数组大小固定了,可它是auto型还是static型?? 定义静态数组不用在前面加static关键字吗?“静态数组”不是应该存储在静态存贮区里的吗?我感觉这个数组还是存贮在栈中的啊!

1. 准确地说,局部变量是在该函数被调用的时候才会得到所分配的内存空间。但是该内存空间的分配形式是在编译的时候就确定了的。
2. char a[10]也会自动被初始化为10个'\0'字符。
3. 一般的数组都是静态数组。动态数组的申请方式一般为:
int *a=malloc(sizeof(int) * 10); // 这个语句申请了一个能容纳10个int的动态数组。

静态数组的意思是:数组的大小在程序编译完就确定了。动态数组的意思是:数组的大小要程序运行起来之后才知道。
比如 int a[10];那么它固定死了,就是10个元素大小。
但动态分配方式就不一定。比如:
int n;
....
int *a= malloc(sizeof(int)*n); //分配了一个动态数组。数组大小由n决定。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-10-29
对于第二个问题,分配一个char a[10]的数组会被初始化么?肯定不会呀,不然memset()这个函数拿来干什么呢?主要就是对内存清零的嘛,写个简单的程序一试就知道了!
对于第三个问题,静态数组就是分配在栈上的数组,当程序执行完毕后,操作系统会对其内存回收,其长度是不变的,也不用加static关键字,动态数组就是利用malloc分配的内存,是在堆上的,使用后系统不会回收,要自己释放,用free,不然会造成内存泄漏,一旦没了内存可分配,系统就挂掉了!

其实我只是想说,定义一个数组,它的初始化肯定要你自己初始化的,绝对不是0!
第2个回答  2010-10-29
1.除了字符串等常量,用malloc等动态分配的变量,其他变量都在链接的时候绑定了内存地址。
2.对
3.这里的静态是指数组长度不变,不是指static
第3个回答  2010-10-29
1,函数是在编译期间只是引入代码,所以它的局部变量是不会开辟空间的,只有在调用的的时候开辟
2是啊,a里面全是随机数据,你可以打印看看吗?当然你也可以char a[10]={0}就全是0值了
3通常的静态的,动态的要用malloc开辟,这个静态是指数组大小固定,不是你说的静态数据,也怪作者用词不当
相似回答