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;
//防止出现野指针
如果调用失败,则返回空指针
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;
//防止出现野指针
如果调用失败返回空指针。
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,返回的不一定是空指针(有可能是有可能不是,决定于具体库的实现,也就是说可能会有库返回的是空指针),最后又说,如果返回是空指针的话,是因为申请内存失败(这地方就是矛盾的地方)。