使用malloc,calloc读取数组并安全释放,用realloc对数组进行扩容
1.我们知道在函数对数组进行初始化数组的初始化结果会随着函数运行的结束而消失,所以可以用malloc申请堆内存的方式对数组进行初始化
#include<stdio.h> #include<stdlib.h> //设置一个能获取数组的函数 int* getArray() { int* res = (int*)malloc(100 * sizeof(int)); for (int i = 0; i < 100; i++) { res[i] = i; } return res; } int main() { int* arr = getArray(); for (int i = 0; i < 100; i++) { printf("%d\n", arr[i]); } free(arr);//free不会清空所在地址的数据,只是会收回对地址的使用权 arr = NULL; return 0; }需要注意的点是:malloc开辟了一个400字节的内存,返回的结果是地址,因此本来是void*的返回结果类型需要用int*的结果去接收
这里还要注意的是要及时释放申请的堆内存,不然的话,长期未清理会导致系统卡死,同时,因为free函数只是收回对地址的使用权,所以还要将数组清空避免以后会读取到之前的数据
这样的话就可以实现在函数中对数组进行初始化了,但同时,malloc只是申请了内存,没有对数组进行初始化,当手动初始化的过程去掉之后,代码就会变成这个结果:
#include<stdio.h> #include<stdlib.h> //设置一个能获取数组的函数 int* getArray() { int* res = (int*)malloc(100 * sizeof(int)); return res; } int main() { int* arr = getArray(); for (int i = 0; i < 100; i++) { printf("%d\n", arr[i]); } free(arr);//free不会清空所在地址的数据,只是会收回对地址的使用权 arr = NULL; return 0; }2.因此,我们可以使用calloc函数对数组进行自动初始化:
#include<stdio.h> #include<stdlib.h> //设置一个能获取数组的函数 int* getArray() { int* res = (int*)calloc(100 , sizeof(int)); return res; } int main() { int* arr = getArray(); for (int i = 0; i < 100; i++) { printf("%d\n", arr[i]); } free(arr);//free不会清空所在地址的数据,只是会收回对地址的使用权 arr = NULL; return 0; }如图所示,calloc会自动把申请内存的元素初始化为0;
3.realloc对数组进行扩容
如下:
#include<stdio.h> #include<stdlib.h> int main(){ int* arr1 = (int*)malloc(10 * sizeof(int)); arr1 = (int*)realloc(arr1, 20 * sizeof(int)); arr1 = (int*)calloc(20, sizeof(int)); for (int i = 0; i < 20; i++) { printf("%d", arr1[i]); printf("\n"); } printf("\n"); free(arr1); arr1 = NULL; return 0; }realloc可以将原本10个整型元素的空间开辟到20个,实现数组扩容的效果
运行结果如下:
使用realloc进行扩容的时候,需要注意的地方是realloc进行扩容,原来的结果会保存,新增加的部分分配垃圾值。
