一、内存分析
(1)栈(stack):由编译器自动分配释放,存放函数的参数值、局部变量的值、返回地址等, 在可执行文件a.out中不存在分配栈区的空间。
(2)堆(heap):一般有程序员自身调用(malloc,calloc函数)来分配空间, 通过free函数释放空间, 但可能会因为程序员的编程失误造成内存的泄漏,另外当程序结束的时候其动态申请的所有空间都将会由系统回收再利用。
(3)数据段(data):存放的是全局变量、静态变量、常数。根据存放的数据,数据段又可以分为普通数据段(包括可读可写/只读数据段,存放静态初始化的全局变量或常量)、BSS数据段(存放未初始化的全局变量)。在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
(4) 文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
(5)代码段(code):用于存放程序代码。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
int a = 1; //分配在静态存储区, (.data)
int b ; // .bss
const int c = 1; //常量储存区
int main()
{
static int a = 1; //静态储存区
int b;//栈区
int *c = new int();//堆区
return 0;
}
二、malloc函数与calloc函数
malloc函数
void* malloc(size_t n);
注意事项:
1、该函数会申请一片大小为n的连续空间, 但是这段空间并不会被初始化(如果这段空间从来被使用, 那么每一位可能是0,那片空间都使用过, 那么就会留下各种杂乱的数据)。
2、malloc的返回类型是void *类型, 根据C/C++规定, void *类型可以强制转化为任何类型的指针
3、所以每次调用了该函数分配空间都要调用memset(void *, int, size_t)函数初始化
calloc函数
void *calloc(unsigned int t, size_t n);
注意事项:
1、该函数与malloc相似缺不同, 因为他要分配t*n大小的连续空间, 并且会将空间初始化0, 以保证无论该动态分配的空间是否使用过都不影响这片空间的使用。实验一:
验证malloc不初始化空间:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
int main()
{
int *num = (int*)malloc(sizeof(int)*7);
for(int i = 0; i < 7; ++i){
num[i] = i + 1;
}
printf("num = 0x%08x\n", num);
free(num);
int *p = (int*)malloc(sizeof(int)*7);
printf("p = 0x%08x\n", p);
for(int i = 0; i < 7; ++i){
printf("p[%d] = %d\n", i, p[i]);
}
free(p);
return 0;
}
结果:
结果分析:
1、第一次molloc和第二次malloc分配到了相同的空间。
2、在第一次malloc后, 通过循环初始化数据, 第二次malloc后,打印其值, 可以看得出来, 出现了第一次初始化的值 3 4 5 6 7
3、针对为什么会出现p[0], p[1]的值不一样, 有待进一步讨论。
实验二, 如果把第二malloc该用calloc分配空间:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
int main()
{
int *num = (int*)malloc(sizeof(int)*7);
for(int i = 0; i < 7; ++i){
num[i] = i + 1;
}
printf("num = 0x%08x\n", num);
free(num);
int *p = (int*)calloc(7,sizeof(int));
printf("p = 0x%08x\n", p);
for(int i = 0; i < 7; ++i){
printf("p[%d] = %d\n", i, p[i]);
}
free(p);
return 0;
}
结果:
结果分析:
1、此时出现了calloc分配的空间答应其值为0, 那是因为calloc分配空间后, 对其所属空间进行了初始化处理。
三、总结
1、malloc和calloc的区别, 以及注意事项