您当前的位置:首页 > 计算机 > 系统应用 > Linux

Linux 进程运行环境

时间:12-14来源:作者:点击数:

1 C 程序的存储空间布局

c 程序占用的内存:

  • 程序代码区 存放函数的二进制代码
  • 文字常量区 常量字符存储地,程序结束由系统释放
  • 全局区(静态区) 全局变量,静态变量存储地,程序结束后由系统释放
  • 堆区 由程序员进行分配和释放,如果程序员不释放,结束后可能由OS回收
  • 栈区 由编译器自动分配和释放,存放函数参数值和局部变量

举例说明:

int a = 1; // 属于全局变量,存放在全局区;
char *p; // 属于全局变量,存放在全局区;
main{
int b; // 属于局部变量,存放在栈区;
char*p1; // 属于局部变量,存放在栈区;
char s[ ] = “123”; // 属于局部变量,存放在栈区;
char *p3 = “456”; // p3属于局部变量,存放在栈区;而怕p3所指的对象在文字常量区
Static int c = 1; // 属于静态变量,存放在全局(静态)区
p = (char*)malloc(100); 
p1 = (char*)malloc(200); // p和p1在栈区,分配得到的100和200字节的区域在堆区
}
  • 栈: 当剩余空间大于申请空间时,系统为其分配内存;否则溢出报错
  • 堆:系统有一个记录空闲内存地址的链表,当程序员向堆申请空间时,系统会先遍历此链表找到合适的地址空间进行分配,一般分配后此空间的起始地址记录此次分配空间的大小
  • 全局变量与静态全局变量:全局变量可作用于各个源程序文件,并且在不同的源文件中都可以进行不同的初始化,而静态全局变量只作用于定义该变量的源文件中,并且只可以初始化一次。

2 存储空间动态分配函数

函数名 作用 优缺点
Malloc 分配指定字节数的存储区  
calloc 为指定对象分配指定空间  
realloc 更改以前分配区的大小  
alloca 在栈帧上分配存储空间 函数返回时自动释放空间

3 C 中的跳转函数

实现跳转功能的函数 setjmp、longjmp

int setjmp (jmp_buf env);
void longjmp (jmp_buf env, int val);

参数 env 是一个特殊类型的 jmp_buf,这种数据类型是某种形式的数组,存放着调用 longjmp 时能用来恢复栈状态的所有信息,一般 env 是全局变量,因为需要从别的函数中引用。

注意:在调用这两个函数时,要先调用 setjmp 函数,再调用 longjmp 函数,否则 longjmp 读到的 env 不确定,会造成系统的崩溃。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐