深入学习C
C
内存管理
内存管理函数
在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。void *malloc(int num);
在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。void *calloc(int num, int size);
该函数重新分配内存,把内存扩展到 newsize。void *realloc(void *address, int newsize);
该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。void free(void *address);
关于 realloc 的坑
1、realloc失败的时候,返回NULL
2、realloc失败的时候,原来的内存不改变,不会释放也不会移动
3、假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉, realloc返回新内存的地址。
4、如果size为0,效果等同于free()。
5、传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的,或者是NULL
6、传递给realloc的指针可以为空,等同于malloc。
如果在连续的realloc中,有一次的size==0,则相当于free了目标指针,则这个指针就变成了野指针,继而在下一次realloc中,就会报错
记住,内存分配一定不要忘记size是 num*sizeof(type)
QUS
1
1.在c语言中,内存模型分为栈和堆。
2,这两种模型内存的方式是不同的,在栈中存放的变量是由系统自动管理的,在函数结束后系统会自动释放,不需要人为的进行任何操作。
3,而在堆中存放的是用户自己管理的内存,手动分配的,malloc建立,系统不会在函数体执行结束后自动释放,需要用户手动释放通过free函数。
当你对分配的空间进行自己的管理和释放需要使用malloc,或者当你的分配的空间在函数结束后还需要存在。
1 | int * create() |
2
为什么可以对 malloc函数声明 的*p直接赋值 而 对 int *p声明中的*p不能直接赋值
1 | int * p = (int *)malloc(sizeof(int)); |
3
紧紧抓住c语言形参与实参的关系,这样才能更好的使用指针
由于是值传递,所以传入指针的值,在函数中进行更改不会改变实参的数据。
eg:
1 | Item itemsave; |
4 小心野针
初始化一个指针的时候,切记要令其指向NULL;
在使用完成一个指针后,切记要进行free.
在free一个指针过后,切记要令其指向NULL