| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 762 人关注过本帖
标题:关于C语言变量内存布局 大家可以参考下
只看楼主 加入收藏
lwb603569640
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:283
专家分:436
注 册:2012-11-9
结帖率:100%
收藏
 问题点数:0 回复次数:13 
关于C语言变量内存布局 大家可以参考下
图片附件: 游客没有浏览图片的权限,请 登录注册

int a = 0; //全局初始化区,.data段

1.    static int b=20; //全局初始化区,.data段
2.    char *p1; //全局未初始化区 .bss段
3.    const int A = 10; //.rodata段
4.    main()
5.    {
6.         int b; //栈
7.         char s[] = "abc"; //栈
8.         char *p2; //栈
9.         static int c = 0; //全局(静态)初始化区 .data段
10.         char *p3 = "123456"; //123456\0在常量区,p3在栈上。
11.         p1 = (char*) malloc(10);//分配得来的10和20个字节的区域就在堆区
12.         p2 = (char*) malloc(20);
13.        strcpy(p1, "123456"); //123456\0 在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方
14.    }
一个进程运行时,所占用的内存,可以分为如下几个部分:
1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。
2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。
3、全局变量、静态变量:初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。
4、文字常量:常量字符串就是存放在这里的,程序结束后由系统释放。
5、程序代码:存放函数体的二进制代码。
搜索更多相关主题的帖子: 内存 C语言 
2012-11-21 15:13
w527705090
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:441
专家分:1882
注 册:2011-6-28
收藏
得分:0 
我来深入了解局部变量

有心者,千方百计;无心者,千难万难。
2012-11-21 16:17
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
楼主,文字常量区是指所有的常量(包括数字常量,字符常量,字符串常量)吗?还有再解释一下命令行参数区是存放什么的?

小小战士,战士中的战斗机!
2012-11-21 17:03
qq254940751
Rank: 1
来 自:长沙理工
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-11-21
收藏
得分:0 
初学就是初学,不大懂
2012-11-21 18:00
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
MACK下,这个正是我需要的

我要成为嘿嘿的黑客,替天行道
2012-11-21 19:30
lwb603569640
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:283
专家分:436
注 册:2012-11-9
收藏
得分:0 
以下是引用小小战士在2012-11-21 17:03:14的发言:

楼主,文字常量区是指所有的常量(包括数字常量,字符常量,字符串常量)吗?还有再解释一下命令行参数区是存放什么的?



main()函数可以有一个字符串指针数组的参数,这个数组将指向命令行区,顾名思义  当你在命令下给程序参数   shell将负责把他复制到命令行区。。

自由、民主、宪政!
2012-11-22 09:42
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
以下是引用lwb603569640在2012-11-22 09:42:11的发言:

main()函数可以有一个字符串指针数组的参数,这个数组将指向命令行区,顾名思义  当你在命令下给程序参数   shell将负责把他复制到命令行区。。

例如:
main.c文件中:
int main(int argc,char *argv[])
{
    int i;
    printf("%d",argc);
    for(i=0;i<3;i++)
    printf("%s ",a[i]);
    printf("\n");
    return 0;
}
执行时传参:gcc main.c
            ./a.out I LOVE YOU
那么命令行参数是指./a.out I LOVE YOU,这时argc是参数个数4,argv是指由这些参数组成的字符串数组的首地址,那么argc和argv都应该保存在栈区啊?如果我说的不对,那么请问argc和argv是怎么保存的?

小小战士,战士中的战斗机!
2012-11-22 11:21
lwb603569640
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:283
专家分:436
注 册:2012-11-9
收藏
得分:0 
以下是引用小小战士在2012-11-22 11:21:35的发言:


例如:
main.c文件中:
int main(int argc,char *argv[])
{
    int i;
    printf("%d",argc);
    for(i=0;i<3;i++)
    printf("%s ",a);
    printf("\n");
    return 0;
}
执行时传参:gcc main.c
            ./a.out I LOVE YOU
那么命令行参数是指./a.out I LOVE YOU,这时argc是参数个数4,argv是指由这些参数组成的字符串数组的首地址,那么argc和argv都应该保存在栈区啊?如果我说的不对,那么请问argc和argv是怎么保存的?




看截图:




图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册

自由、民主、宪政!
2012-11-22 12:42
lwb603569640
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:283
专家分:436
注 册:2012-11-9
收藏
得分:0 
以下是引用lwb603569640在2012-11-22 12:42:19的发言:





看截图:

以上是linux 0.12内核的摘录,不同系统会有不同   基本原理都是一样的。。仅仅做参考

自由、民主、宪政!
2012-11-22 12:47
lwb603569640
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:283
专家分:436
注 册:2012-11-9
收藏
得分:0 
以下是引用lwb603569640在2012-11-22 12:47:58的发言:


以上是linux 0.12内核的摘录,不同系统会有不同   基本原理都是一样的。。仅仅做参考




在告诉大家一点    windows系统编程    Unix环境高级编程   都对相应系统的这方面原理有详细说明。。。

自由、民主、宪政!
2012-11-22 12:58
快速回复:关于C语言变量内存布局 大家可以参考下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027791 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved