malloc,relloc,calloc的区别
一. malloc函数
void *malloc( size_t size );
malloc函数作用
malloc函数作用是动态开辟一个空间,分配指定字节数的存储区,此存储区中的初始值不确定
malloc返回值
malloc返回一个指向已分配空间的空指针,如果可用内存不足,则返回NULL。
若要返回指向非void类型的指针,请在返回值上使用类型转换。保证返回值所指向的存储空间对任何类型的对象的存储进行适当对齐。
如果size为0,malloc将在堆中分配一个长度为0的项,并返回一个指向该项的有效指针。
总是检查malloc的返回值,即使请求的内存量很小。
举例实现
利用malloc函数动态创建一个数组,并且数组大小由用户输入,并且输出这个数组
#include<stdio.h>
#include<stdlib.h>
int main() {
int n = 0;
scanf_s("%d", &n);
int* ptr = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
scanf_s("%d", &ptr[i]);//依次为变量赋值
}
printf("您输入的数值为:");
for (int j = 0; j < n; j++) {
printf("%d ", ptr[j]);//输出数据
}
return 0;
}
二.relloc函数
void *realloc( void *memblock, size_t size );
realloc函数作用
realloc函数返回值
realloc函数的作用是更改动态开辟的空间的长度,当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定。
realloc返回值
realloc返回一个指向重新分配(可能移动)内存块的空指针。如果大小为0且buffer参数不为NULL,或者没有足够的可用内存将块扩展到给定大小,则返回值为NULL。
在第一种情况下,释放原始块。
第二,原块不变。返回值指向一个存储空间,该存储空间保证对任何类型的对象的存储进行适当对齐。
若要获得指向非void类型的指针,需要在返回值上使用类型转换。
举例实现
#include<stdio.h>
#include<stdlib.h>
int main() {
int n = 0;
scanf_s("%d", &n);
int* ptr = (int*)malloc(sizeof(int) * n);//动态开辟一个空间
int* ptr1 = (int*)realloc(ptr,sizeof(int));//调整空间大小
int* ptr2 = (int*)realloc(NULL, sizeof(int));//申请新的空间,功能和malloc相同
return 0;
}
三.calloc函数
void *calloc( size_t num, size_t size );
calloc函数作用
calloc函数的作用是为指定长度的对象,分配能容纳其指定个数的存储空间,并将初始值全部赋为0。
calloc返回值
返回一个指向已分配空间的指针。保证返回值所指向的存储空间对任何类型的对象的存储进行适当对齐。若要获得指向非void类型的指针,需要在返回值上使用类型转换。
使用malloc函数动态开辟一个数组,数组大小由用户输入。
由下图可知当输入3的时候会开辟大小为三个整形的大小的数组
输出为三个0,证明当使用malloc函数开辟数组时会将所有元素初始化为o。
代码为:
#include<stdio.h>
#include<stdlib.h>
int main() {
int n = 0;
scanf_s("%d", &n);
int* ptr = (int*)calloc(n,sizeof(int));//动态开辟一个空间
for (int j = 0; j < n; j++) {
printf("%d ", ptr[j]);//输出数据
}
return 0;
}