C语言学习:C语言编译后的内存分布。

C语言编译后的内存分布。

C语言经过编译后将内存分为以下几个区域:栈、堆、全局(静态)存储区、文字常量区和程序代码区。
图解

栈:由编译器进行管理,自动分配和释放,用于存放函数调用过程中的各种参数、局部变量、返回值以及函数的返回地址。
(操作方式类似于数据结构中的栈。)

//例:
void fun(int num)//函数参数num
{
    int n = num;//局部变量n

    return n; // 返回值n
}

堆:用于程序动态申请分配和释放空间。
(C中的malloc()和free(),C++中的new和delete均是在堆中进行的。)
一般情况下,程序员在编写程序时应该将申请的空间在使用后释放,若没有主动释放空间,则在程序运行结束时系统自动回收释放。

//在堆中进行
int *p = (int *)molloc(sizeof(int));
申请一块大小和int类型大小相同的内存(),将地址转换为int *型,
然后放在p中

malloc()函数的作用是分配制定字节数的空间,
返回默认为void 类型的指针指向开辟空间的首地址

sizeof()为单目运算 求出对应类型所占用的字节数

(类型名)为单目运算 为强制类型转换
要注意的是 malloce函数申请得到的空间是无类型的空间 
必须强制转换成对应指针可以指向的空间的类型
这里定义的是int *p 所以p指针只能指向int型空间

sizeof(int) 求得int类型所占的字节数(4个字节)
等同于sizeof(4)

malloc(sizeof(int)) 申请一个跟int所占的空间大小一样的空间
(int*)malloc(sizeof(int)) 将申请得到的空间地址转换成了int类型空间地址
最后就可以赋值给指向int型空间的p指针了。

全局(静态)存储区:分为DATA段和BSS段,该区域的生命周期为整个程序,即从程序第一行开始到main函数结束。
该区域在程序运行结束时,自动释放内存空间。

DATA段(全局初始化区):存放初始化后的全局变量和静态变量。
BSS段(全局未初始化区):存放未初始化的全局变量和静态变量。

int a = 0;//存储于DATA段
int b;//存储于BSS段

注:BSS段在程序执行前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。
(上述程序在编译后a和b的值均为0。)

文字常量区:存放常量字符串。程序结束后由系统释放。

int main()
{
    char *p = "abcdefg";
    //abcdefg/0在文字常量区,p在栈上
}

程序代码区:用于存放程序的二进制代码。

最后引用一张图来体现各个部分的实际存储位置。
例子

全部评论

相关推荐

10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务