一.Windows下的内存分布
如图所示:基本要说的都在图上了
二.C语言动态内存函数
由于栈区的内存太小,很容易就把栈区挤爆了,所以需要在堆区申请内存来使用,如下的3个函数,都是从堆区来申请内存的,并且申请到的空间都没有初始化
- 头文件<stdlib.h>
1.malloc函数
void* malloc(unsigned int size);//函数声明
int *p = (int *)malloc(size*sizeof(int));//基本用法
size代表了申请内存的字节数,是一个整型。返回值是void*类型,所以一般使用是如上述使用的,把它强转成所需要的类型
2.calloc函数
void* calloc(unsigned int count,unsigned int type_size);
count代表申请的个数,type_size代表1个所占的字节数,返回值还是void*。跟malloc不一样的是,这里弄成了个数和单个字节数,而malloc是总的字节数大小,一般都用的是malloc,calloc少用。
3.realloc函数
realloc又称扩容函数,是原先开辟的内存不够了,通过realloc再重新申请一段更大的内存空间
- 这里对void*的理解是:任何指针都可以赋值给void*,意味着参数可以是任意类型的指针。
void* realloc(void* address,unsigned newsize);
address是原来申请的内存地址,newsize是现在申请的更大的内存的字节数
- realloc函数的三种情况
第二种情况中,原先后面紧挨着的内存不够了,realloc会重新寻找另一段空间去分配
- 鉴于第三种情况,一般会把申请到的空间给另一个指针,然后通过指针赋值给另外一个,避免申请失败,以前的指针变量也被赋值为空。
4.free函数
注意free的地址必须是动态申请的地址,还得是首地址
free(void* p);
5.初始化函数memset
头文件<string.h>
int* p = malloc(100);
memset(p,0,100);
p代表初始化的内存地址,0代表用0初始化,这里注意的是这里是按字节初始化的,也就是每个字节初始化为0,100代表初始化的大小(字节数)
6.动态内存开辟的使用范例
int* p = (int*)malloc(100*sizeof(int));
memset(p,0,100*sizeof(int));
int*q = (int*)realloc(p,200*sizeof(int)); //注意可能申请失败,则不希望原本的指针被赋值为空
if(q!=NULL) q = p;
free(p);