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