对malloc calloc realloc函数以及free函数的认识

来源:互联网 发布:福州锐捷网络招聘 编辑:程序博客网 时间:2024/06/05 20:18

涉及到动态内存的分配与释放,我们知道只要在堆上申请了内存我们都要释放掉否则会造成内存泄漏

涉及到动态内存分配我们可定会涉及到malloc calloc realloc free这些关于动态内存分配及释放的函数.

对malloc函数的认识:在使用malloc函数分配内存时它申请的内存不会自己进行初始化,如果内存初始化很重要的话,你需要自己手动初始化。malloc在库函数中的标准形式为void *malloc( size_tsize); 其中它的返回值为void *,函 数参数为(size_t size).其中size_t size为分配内存的字节数。但其实我们应该了解malloc真正申请的内存是大于 size_t size 的,多余的内存会保存其他的信息,比如保存申请内存的源信息这样在释放的时候就直接释放了而不需要指明它的大小。


对calloc函数的认识: 在使用calloc函数时我们必须要了解calloc函数在申请内存时会对内存进行初始化作用。calloc和malloc之间还有一个细小的差别,虽然都是申请内存但它们函数参数不一样,calloc在库函数的中的标准形式是void *calloc( size_tnum, size_tsize );它的函数返回值类型是 void*,函数参数有两个一个是size_t num表示需元素的数量,而 size_t size表示每个元素所对应的字节数,因此它在申请内存时所申请的内存的大小等于两数之积。真正申请的内存是大于 这两数之积的,多余的内存会保存其他的信息,比如保存申请内存的源信息这样在释放的时候就直接释放了而不需要指明它的大小。


realloc函数:void *realloc( void *memblock, size_tsize);这个函数的返回值为void *,函数参数有两个一个为 void*memblock:表示要改变内存大小的指针名,size_t size 表示新的内存大小。

在使用realloc函数时我们需要知道realloc函数用于修改原先已分配内存的大小,使用这个函数我们可以扩大或者缩小内存的大小。

但是在使用realloc函数扩大内存的时候我们需要知道扩大内存的两种方式:

1、原先申请的内存块足够大到能容纳你所要扩大的内存,则原来内存块的信息依然保留新的内存直接添加到原来内存块的后面。 

 2、原来的内存块无法改变大小,则realloc重新分配一块正确大小的内存,并把原先那块内存的内容复制到新的块上。

但在使用realloc函数时建议使用一个新的指针指向新分配的内存。

free()函数:关于free()函数我们可以知道它是释放内存的但是怎么释放我们应该有以下了解,free()释放内存时不需要知道具体释放内存的大小,因为之前在申请内存时就保留了源信息。

但是在free的时候要特别注意如果你在一个初始化函数中申请内存然后在main函数中要去调用这个函数当然你在main函数中使用完毕之后你要释放内存。很容易发生错误举个例子:

#include<stdio.h>void Getmemory(char *p,int num){p = (char *)malloc(num*sizeof(char));}int main(){char *str = NULL;Getmemory(str, 10);strcpy(str,"hello bit");        free(str);//根本不会起作用因为没有给str分配内存system("pause");return 0;}


编译器在执行到strcpy(str,"hello bit");会直接报错因为str的值仍为空,即malloc根本没有给str分配内存,而是将内存分配给了str的临时拷贝_str中,如果我们想要获取这块内存的方法有两种。

1、直接用return 将p返回

然后用str去接收返回值p,则此时str就会被分配号内存。代码如下:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdio.h>char *Getmemory(char *p,int num){p = (char *)malloc(num*sizeof(char));return p;}int main(){char *str = NULL;str = Getmemory(str, 10);printf("%s",strcpy(str, "hello"));        free(str);system("pause");return 0;}




第二种方法:我们可以通过传一个二级指针的参数然后再free掉二级指针里保存的地址

#include<stdio.h>void Getmemory(char **p,int num){*p = (char *)malloc(num*sizeof(char));}int main(){char *str = NULL;Getmemory(&str, 10);printf("%s",strcpy(str, "hello"));free(str);system("pause");return 0;}


两种方法都正确。

0 0
原创粉丝点击