免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5208 | 回复: 13
打印 上一主题 下一主题

栈和初始化数据段中的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-19 15:03 |只看该作者 |倒序浏览
UNIX编程书中介绍C程序的存储空间布局
在存储器中有
初始化数据段和栈
在初始化数据段的数据有 int maxcount=99
在栈中的数据有自动变量

我的疑问是
在概念的定义中
maxcount不也是自动变量吗
在栈中的自动变量具体是指的什么呢
它们的区别

论坛徽章:
0
2 [报告]
发表于 2006-09-19 15:34 |只看该作者
书上说明了有四个区,代码区,堆区,栈区,全局数据区,各个区有相应的数据放着,一般栈上的数据生存期短。书上都有很详细的描述

论坛徽章:
0
3 [报告]
发表于 2006-09-19 18:12 |只看该作者
我是在APUE中看的
UNIX进程的环境一章中
应该说它划分的更细
"初始化数据段和栈"

希望有人能解答一下

论坛徽章:
0
4 [报告]
发表于 2006-09-19 19:06 |只看该作者
生存期不同

论坛徽章:
0
5 [报告]
发表于 2006-09-19 19:18 |只看该作者
LZ和我看的进度差不多 呵呵
我记得是函数外的初始化变量如int maxcount=99以及
全局变量和静态变量是放在初始化数据段的
而函数体以内的变量(不管初始化了还是没有初始化)是在栈上的(当然不包括动态分配的)

应该没有记错吧

论坛徽章:
0
6 [报告]
发表于 2006-09-19 23:00 |只看该作者
我记得是函数外的初始化变量如int maxcount=99以及
全局变量和静态变量是放在初始化数据段的
而函数体以内的变量(不管初始化了还是没有初始化)是在栈上的(当然不包括动态分配的)

同意

论坛徽章:
0
7 [报告]
发表于 2006-09-19 23:56 |只看该作者
原帖由 iamfog 于 2006-9-19 19:18 发表
LZ和我看的进度差不多 呵呵
我记得是函数外的初始化变量如int maxcount=99以及
全局变量和静态变量是放在初始化数据段的
而函数体以内的变量(不管初始化了还是没有初始化)是在栈上的(当然不包括动态分配的) ...



如果你没记错的话,那肯定是书上没讲: static 是放哪的?

论坛徽章:
0
8 [报告]
发表于 2006-09-20 05:17 |只看该作者
根据APUE,程序分为下面的段:
text, data (initialized), bss, stack, heap

text和data需要存入可执行文件,bss的数据在程序载入时由内核清0,因此不需保存。
所以有初值的全局变量和static变量在data区,未赋初值的在bss段,函数的局部变量和参数在stack,动态分配的在heap。

论坛徽章:
0
9 [报告]
发表于 2006-09-20 08:27 |只看该作者
emacsnw 解释的很清楚
谢谢

论坛徽章:
0
10 [报告]
发表于 2006-09-20 08:35 |只看该作者
这是一个前辈写的

//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP