- 论坛徽章:
- 0
|
详细给你讲下!- #include<stdio.h>
- int a = 100;
- int arr[10];
- int b;
- int add(int a, int b)
- {
- int c = a+b;
- return c;
- }
- int main()
- {
- int m = 10;
- int n = 20;
- int val_1 =0;
- int val_2 = 0;
- printf("a=%d\n",m);
- printf("b=%d\n",n);
- for(int i=0; i<10; ++i){
- printf("%d\t",arr[i]);
- }
- printf("%n");
- val_1 = add(a,b);
- val_2 = add(m,n);
- printf("a+b=%d\n",val_1);
- printf("m+n=%d\n",val_2);
- m = n;
- n = a;
- return 0;
- }
复制代码 C程序的存储空间布局有以下几个方面。
1:正文段(Text segment),这里面就是CPU所要执行的程序指令。它有两个特性a:可共享,比如你打开了10个vi编辑器,这十个vi进程在内存里面的正文段只需要一个副本。b:只读,防止程序意外修改其自身指令。像上面这个简单的程序,编译之后变成二进制文件,其正文段就是CPU执行这个程序的所有指令。
2:初始化数据段(Initialized data segment),也称数据段,这里面存储了程序当中明确赋予初值的变量。比如上面程序当中的变量a。
3:未初始化数据段(Uninitialized data segment),也称bss段,存放在这个里面的变量,在程序运行之前内核将此段中的数据初始化为0或者空指针。比如上面程序当中的arr数组和变量b。
4:栈,自动变量变量和每一次函数调用所需要保存的信息都在栈当中。比如上面程序在运行过程中,变量,m.n...,以及在调用add函数时,函数里面的临时变量,以及函数返回的地址,调用者的信息等。注意:递归调用时,函数每调用一次自身,就会使用一个新的栈帧,这样做的好处是同一函数的两个调用实例的变量集不会互相影响。因此在使用递归的时候要注意递归次数。栈的大小有限,ubuntu 12.04上面测试了一下,一个线程栈的大小默认最大为8M,当栈的使用超过这个大小而没有相应处理时,会崩溃。当然这个大小,可以通过ulimit命令或者再程序当中调用相应接口改变(创建线程时可以通过pthread_attr_setstack这一类函数实现,其他方法没有特意去查)。
5:堆,这个应该简单,动态分配内存都会从这里面取。当然这是在new没有被重载,malloc等函数没有被覆盖的情况下。
|
|