C语言动态内存管理malloc、calloc、realloc、free的用法和注意事项

此文是参考http://www.cplusplus.com/reference/cstdlib/里的动态内存管理部分所写,如发现有问题和不足之处,请参看原文,最好能帮忙指出,谢谢。

1.void* malloc (size_t size);

malloc:分配一块size Byte大小的内存,返回一个指向该块内存开始的指针,指针类型是void。
其中size_t代表无符号整形类型

例如:

int *number;
number = (int *)malloc(sizeof(int));//分配一个大小为sizeof(int)的存储空间,
//返回的指针需要强转成需要的类型
if(NULL == number)//判断调用是否成功,不成功就退出
{
    exit(0);
}
*number = 100;//内存里的内容没有被初始化,值不确定,这里要记得初始化
free(number);//用完之后要free,释放内存
number = NULL;//防止出现野指针


如果size是0,那么返回值不确定,取决于不同库的实现,但是返回值必定是不能引用的。
如果调用失败,则返回空指针

2.void* calloc (size_t num, size_t size);

calloc:为一个大小为num的数组分配内存,每个元素的大小是size,把每个元素初始化为0

int *number;
int i = 0;
number = (int *)calloc(3,sizeof(int));//分配一个大小为3*sizeof(int)的存储空间,
//返回的指针需要强转成需要的类型
if(NULL == number)//判断调用是否成功,不成功就退出
{
    exit(0);
}
for(;i<3;i++)
{
    printf(“address:%d number[%d] = %d\n”,&number[i],i,number[i]);//打印结果是0
}
free(number);//用完之后要free,释放内存
number = NULL;//防止出现野指针


如果size是0,那么返回值不确定,取决于不同库的实现,但是返回值必定是不能引用的。
如果调用失败返回空指针。

3.void* realloc (void* ptr, size_t size);

realloc:改变ptr指向的内存空间的大小,把指向的内存空间的内容移动到新空间里(地址通过函数返回,可能指向原来的地址也可能指向新地址)
ptr指向的内存空间必须是通过malloc、calloc、realloc函数分配的!!!如果ptr是空指针,那么realloc函数的malloc的功能是一样的。

int * number;
int * renumber;
number = (int *)calloc(5,sizeof(int))
if(NULL == number)//判断调用是否成功,不成功就退出
{
    exit(0);
}

renumber = (int *)realloc(number,3*sizeof(int));
if(NULL != renumber)//如果分配成功,就让number指向新分配的内存,这样不会造成内存泄漏,
{ //因为number原来指向的内存已经被自动回收。
    number = renumber;
}
renumber = NULL;
...
free(number);//这里只需要free number就可以了。
number = NULL;
如果size为0:
1.在C90(C++98)标准里,会回收ptr指针指向的内存,并且返回空指针。
2.在C99(C++11)标准里,会返回一个不能被引用的地址(不确定是不是空指针,取决于不同的库实现)

如果函数调用失败,会返回一个空指针,ptr所指向内存也不会被回收,即会保持原来的ptr不变(地址不变,内容不变)。

如果返回的是空指针:
1.在C90(C++98)标准里可能性有两种:
1).size为0(ptr指向的地址将会被回收);
2).函数没有申请到内存空间(ptr指向的地址将不会改变)
2.在C99(C++11)标准里只有一种可能:函数申请内存空间失败(此处好像和上面的说法有一点点冲突)

4.void free (void* ptr);

free:回收内存
如果ptr不是通过malloc、calloc、realloc函数分配的,会造成不可预测的行为。
如果ptr为空,那么free函数不作任何处理。

int * buffer1, * buffer2, * buffer3;
buffer1 = (int*) malloc (100*sizeof(int));
buffer2 = (int*) calloc (100,sizeof(int));
buffer3 = (int*) realloc (buffer2,500*sizeof(int));
free (buffer1);
free (buffer3);
注:此处是上文所说的冲突的具体原因,
在C99(C++11)里,上面说的如果size为0,返回的不一定是空指针(有可能是有可能不是,决定于具体库的实现,也就是说可能会有库返回的是空指针),最后又说,如果返回是空指针的话,是因为申请内存失败(这地方就是矛盾的地方)。


你可能感兴趣的:(C/C++)