程序占用内存
- 程序代码区
- 常量区存放常量。程序结束时由OS回收。
- 全局区(静态区)存放全局变量和静态变量。初始化的全局变量和静态变量在一块区域(data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(BSS)。 程序结束时由OS回收。只有全局变量或者static变量会初始化为0。(编译时就分配
- 堆区heap存放的变量(用new,malloc,calloc,realloc等分配内存函数得到的变量)由程序员分配释放。动态分配存在内存泄露的问题。指针、地址(运行时才分配
内存泄漏发生在程序运行。
- 栈区stack存放的变量(局部变量、函数参数等)由编译器自动分配释放。有局部生存期。数组
栈区的执行效率高于堆区
内存溢出,申请不到足够的内存;
内存泄露,无法释放已申请的内存
指针指向字符串时,字符串是常量,存储在常量区,而指针存储在栈区,不能对其操作修改。
char p=new char[100]; p在栈 new在堆
预处理器会把name####type##_type解释成4段:“name”、“”、“type”以及“*_type”
int b;b在栈区。
对于栈中内存如果没有初始化,则会出现“烫烫烫烫烫烫”。对于堆中内存如果没有初始化,则会出现“屯屯屯屯屯”
分配空间
0)alloc:唯一一个在栈上申请内存
1) malloc 函数: void malloc(unsigned int size)
在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。
2)calloc 函数: void calloc(unsigned int num, unsigned int size)
按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。
calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。
3)realloc 函数: void realloc(void ptr, unsigned int size)
动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。
申请的内存空间不会进行初始化。
4)new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。
sizeof
是运算符也是关键字
https://blog.csdn.net/u014186096/article/details/48290013
编译时运算
sizeof内的运算不执行,sizeof(i++)会计算i++类型的大小