菜猫学习linux笔记(1)

内存的管理和使用

size hello

text 代码区静态数据

data 全局初始化数据区

bss 未初始化数据区

一个计算机应用程序在内存中可以分成两个部分:存放代码的代码段和存放数据的数据段。代码段存放用户编写的代码,数据段可以分成堆和栈

 

数据段有增加了全局初始化数据区(initialized data segment / data segment)包含程序中明确被初始化的全局变量、静态变量(包括全局和局部静态变量)以及常量(例如字符串)

 

未初始化数据区(uninitialized data segment)bss区 存放全局未初始化变量

 

有编译器分配释放的区域,用来存放函数的参数,局部变量等。当调用函数的时候,被调用函数的参数和返回值被存储到当前程序的栈区,之后被调用函数再为自身的自动变量和临时变量在栈区上分配空间。当函数调用返回时,在战区内的参数返回值,自动变量和临时变量等会被释放。

这就是为什么C语言函数参数如果不是指针的话,被修改的参数结果用户无法得到的原因。

堆 heap

位于bss段和栈之间,用来动态分配内存。这段区域有程序员管理

堆的管理和栈不同,操作系统在堆空间维护一个链表,每次程序员从堆分配内存的时候,操作系统会从堆区扫描未用空间,当一个空间的大小符合申请空间的时候,就把此空间返回给程序员,同时把申请的空间加入链表。、

 

程序的内存分成若干区域基于以下考虑:

程序运行的时候多数按照顺序运行的,虽然有跳转和循环 数据需要多次访问 开辟单独的数据空间方便数据访问和分类

临时数据放在栈区

全局数据和静态数据在整个程序执行过程中都可能需要访问,因此单独存储管理

用户需要自行分配的内存安排在堆区,便于用户管理内存,以及操作系统监控

 

 

malloc返回的是分配内存的首地址

 

calloc 分配新内存 realloc用来改变一块已经分配的内存大小

void *calloc(size_t nmemb, size_t size)nmemb 表示要分配元素个数 size表示每个元素大小

 

malloc函数分配内存后不能初始化内存

calloc 分配空间会初始化新分配的内存空间

 

int *p = (int *)malloc(1024,sizeof(int))

 

int *p = (int *)malloc(1024*sizeof(int))

memset(p,0, 1024*sizeof(int))

 

 

void *realloc(void *ptr,size_t size)

realloc函数调整后内存空间起始地址有可能与原来不同

 

 

 

 

原文地址:https://www.cnblogs.com/amywu2015/p/5216343.html