加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C语言中局部数组和全局数组

(2014-11-27 10:06:06)
标签:

it

分类: zigbee
关于c语言的数组存在两种赋初值的方法,一种是静态赋,一种是动态赋初值,我想知道静态赋初值的话是不是默认此数组是静态数组,数据也因此存贮在静态存储区?高手帮帮忙吧!谢谢了
 

你提这个问题涉及几个方面
1.静态存储区
2.静态数组(static数组),全局数组,动态数组,局部数组
3.给数组赋初值

下面分别解答
1.静态存储区/BSS段/栈
一个程序一般分为3段:text段,data段,bss段
text段:就是放程序代码的,编译时确定,只读,
data段:存放在编译阶段(而非运行时)就能确定的数据,可读可写
就是通常所说的静态存储区,赋了初值的全局变量和静态变量存放在这个区域,常量也存放在这个区域
bss段:定义而没有赋初值的全局变量和静态变量,放在这个区域
2.数组定义
函数外不加static定义的数组为全局数组
用static定义静态数组(函数内或函数外)
用malloc定义动态数组
函数内不加static关键字的数组,为局部数组
3.数组赋初值
对全局数组,定义并赋初值,则在data段,定义未赋初值,在bss段
静态数组也一样,无论静态数组是在函数内还是函数外,定义并赋初值,则在data段,定义未赋初值,在bss段
动态数组,全是从堆上分配的
局部数组,从函数的栈上分配的,显然存储在栈上,函数结束就释放

重点区分最具有迷惑性的以下两种定义
int func1()
{
char s[200]="hello world!";
}

int func2()
{
static char s[200]="hello world!";
}

func1中,"hello world!"为常量数组,存放在data段
数组s从func1的栈上分配,然后常量数组的值复制到数组s中

func2中,"hello world!"为初值,数组s编译时就确定在data段,
初值为"hello world!"

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有