首页 未命名正文

linux编程_C语言之程序中内存的泉源:栈 堆 数据段

云返利网 未命名 2020-05-26 09:06:35 12 0

程序在运行的时刻,其内存的泉源主要通过三种方式:  栈  堆  数据段,总体上来讲栈是一样平常用来存放小内存的局部变量,堆内存和数据段的属性很像,在使用的的时刻,若是这个变量是随同程序一直存在则使用全局变量,也就是放在数据段,若是一个变量使用完了就没用了,那么就适适用堆内存(先申请,然后释放即可),

一:栈(stack):
1:栈在使用的时刻是编译器自动分配内存空间的,不需要程序员的过问,其次栈的巨细是有限的,以是当我们界说的变量需要大片的内存的时刻就不适合使用栈,
2:栈存放的是通俗变量,栈的在使用的时刻是频频使用的,以是栈内存是脏的,在界说通俗变量的时刻,若是纰谬变量举行初始化,那么变量的值就是随机的。
3:栈是先进后出的,其内存空间是向下增进的。

二:堆(heap):
1:堆得使用时是由程序员来操作的,程序员通过malloc来向内存申请堆内存,使用完以后通过free来释放这部门内存,若是这部门内存在使用完以后没有举行内存的释放,那么这部门内存管理器就会以为这部门内存一直被占用的,体现出来的就是程序吃内存,也就是所谓的内存泄露,若是没有释放内存,则被占用的内存只有当程序竣事以后才会被释放。一样平常需要大片的内存时才使用堆,堆是先进先出的,其内存空间是向上增进的。
代码示例:

1 #include
#include
int main(void)
{
//申请内存
int *p = (int *)malloc(100);
if(p == NULL) //错误检查
{
printf("error \n");
return -1;
}
//内存使用S
*(p+4) = 1024;
*(p+3000) = 111;
printf("*(p+3) = %d\n", *(p+4));
printf("*(p+30000)) = %d\n", *(p+3000));
printf("p = %p \n",p);
printf("(p +4) = %p \n",(p +4));

free(p); //释放内存

printf("*(p+3) = %d\n", *(p+4));
printf("*(p+30000)) = %d\n", *(p+3000));
printf("p = %p \n",p);
printf("(p +4) = %p \n",(p +4));

p = NULL; //制止野指针

return 0;
}

运行效果:
*(p+3) = 1024
*(p+30000)) = 111
p = 0x8efb008
(p +4) = 0x8efb018
*(p+3) = 1024
*(p+30000)) = 111
p = 0x8efb008
(p +4) = 0x8efb018
剖析:
1:堆内存可以越界接见,然则现实中最好照样不要,由于你在使用的时刻越界接见就意味着踩到别人了
2:堆内存在释放之后还可以接见,而且接见的值照样稳定的,说明堆内存也是脏的,堆内存释放的时刻并没有对使用过的没存举行清算。

三:数据段(.data )
1:一个程序主要有数据段(.data) 代码段  和bss段,差别的段具有差别的段属性
数据段:(又叫数据区、静态数据区、静态区)数据段存放的是程序的中显示初始化的全局变量(不包括初始化为0的全局变量),同时需要注重的是全局变量才算是程序的数据,局部变量不是程序变量,只是函数数据
代码段:代码段就是程序中的可执行部门,直观明白代码段就是函数堆叠组成的。代码段是只读的。
bss段:(又叫zero initial 段)bss段存放的是为显示初始化的全局变量已经初始化为0的全局变量(C语言中默认全局变量的初始化就是为0),以是可以明白为bss段就是初始化为0的数据段。
2:放在.data段的变量有两种:第一种是显式初始化为非0的全局变量,另一种是静态局部变量,也就是static修饰的局部变量(通俗变量是分配在栈上面,静态局部变量是漫衍在.data段)

四:代码段中的特殊数据

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)