三:程序中段的使用
下面用一个简单的例子来说明C语言中变量和段的对应关系。C语言程序中的全局区(静态区),实际对应着下述几个段:RO Data; RW Data ; BSS Data.
一般来说,直接定义的全局变量在未初始化数据区,如果该变量有初始化则是在已初始化数据区(RW Data),加上const则将放在只读数据区。
- const char ro[ ] = {"this is read only data"}; //只读数据区
- static char rw_1[ ] ={"this is global read write data"}; //已初始化读写数据段
- char BSS_1[ 100]; //未初始化数据段
- const char *ptrconst ="constant data"; //字符串放在只读取数据段
- int main()
- {
- short b; //在栈上,占用2个字节
- char a[100]; //在栈上开辟100个字节, 它的值是其首地址
- char s[ ]="abcdefg"; //s在栈上,占用4个字节,"abcdefg"本身放置在只读数据存储区,占8个字节
- char *p1; //p1在栈上,占用4个字节
- char *p2="123456"; //p2 在栈上,p2指向的内容不能改,“123456”在只读数据区
- static char rw_2[ ]={"this is local read write data"};//局部已初始化读写数据段
- static char BSS_2[100]; //局部未初始化数据段
- static int c = 0; //全局(静态)初始化区
- p1=(char *)malloc(10 * sizeof(char ) ); //分配内存区域在堆区
- strcpy(p1,"xxxx"); //“XXXX”放在只读数据区,占5个字节
- free(p1); //使用free释放p1所指向的内存
- return 0;
- }
读写数据段包含了忆初始化的全局变量 static char rw_1[ ]以及局部静态变量static rw_2[ ].其差别在于编绎时,是在函数内部使用的还是可以在整个文件中使用。对于rw_1[] 无论有无static 修饰,其都将被放置在读写数据区,只是能否被其它文件引用与否。对于后者就不一样了,它是局部静态变量,放置在读写数据区,如果没static修饰,其意义完全改变,它将会是开辟在栈空间的局部变量,而不是静态变量,在这里rw_1[],rw_2[]后没具体数值,表示静态区大小同后面字符串长度决定。
|