1、全局变量和局部变量
全局变量储存在程序的数据段中,数据段用于存储程序中定义的全局变量和静态变量,周期为程序的开始到程序的结束
局部变量通常存储在程序的栈段,栈区用于存储,函数调用,函数参数,局部变量,局部变量的生命周期为函数调用开始到函数的返回结束
2、内存分配
一:从全局存储区域分配(程序数据段区):这时内存在程序编译阶段就已经分配好,该内存在程序运行的整个周期都有效,如:全局变量、static静态变量。
二:从栈区分配:在执行函数的时候,函数中的局部变量的存储单元都可以从栈中分配,函数执行结束后这些存储单元都会被自动释放,实现从栈中分配存储单元运算操作内置于处理器的指令集中,效率很高 但是分配的内存容量有限。
三:从堆中分配:也称为动态内存分配,在程序运行期间,可以使用malloc和new申请任意数量的内存单元,由程序员决定在什么时候使用free和delete释放内存。
3、父子进程关系
fork创建子进程后,父子进程用相同的代码段,子进程会copy父进程的数据段,栈区,堆区
4、线程之间关系
线程之间共享数据段,堆区,不共享栈区,每个线程都有自己的寄存器集合,包括程序计数器、栈指针、状态寄存器等,这些也是线程私有的。
5、大变量数据传给小变量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(){int a = 0x37F;char b = a;printf("%d\n", a);printf("%d\n", b);
}
关于数据存储方式
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>typedef union{unsigned long u_val;signed long i_val;uint16_t val[4];
}reg_sdate_t;int main(){reg_sdate_t u64_temp;u64_temp.val[3] = 0;u64_temp.val[2] = 0x1;u64_temp.val[1] = 0x2345;u64_temp.val[0] = 0x6789;printf("%lx\n", u64_temp.u_val);// printf("%ld", sizeof(long long));printf("short int %ld\n", sizeof(short int));
}