c语言学习之基础知识点介绍(十九):内存操作函数
一、malloc函数
/* 首先需要导入头文件 #include <stdlib.h> malloc void* malloc(n); n是字节大小 开辟堆空间,开辟的字节数以n为准 返回的是开辟空间的首地址 void*是万能指针,也就是说你可以用任意类型的指针去指向 */ //malloc用法 int *p = malloc(sizeof(int)); *p = 30; printf("%p %d\n",p,*p);//0x100105490 char *pc = malloc(sizeof(char)*4); pc[0]= 'a'; pc[1] = 'b'; pc[2] = 'c'; pc[3] = '\0'; printf("%s\n",pc); char *pc = malloc(4); *pc = 'a'; *(pc+1) = 'b'; *(pc+2) = 'c'; *(pc+3) = '\0'; printf("%s\n",pc); char *pc = malloc(4); char *temp = pc; *pc = 'a'; pc++; //自身+1 *pc = 'b'; pc++; *pc = 'c'; pc++; *pc = '\0'; printf("%s\n",temp); char *pc = malloc(1); *pc = 'h'; printf("%c\n",*pc);
二、calloc函数
//calloc用法 int nums[3] = {10,20,30};//在栈区 int *p = calloc(4, 3);//在堆区 p[0] = 10; p[1] = 20; p[2] = 30; for (int i =0; i<3; i++) { printf("%d\n",p[i]); } int *p = calloc(4, 3);//在堆区 *(p) = 10; *(p+1) = 20; *(p+2) = 30; for (int i =0; i<3; i++) { printf("%d\n",p[i]); }
malloc和calloc的区别:
malloc不会初始化,会有垃圾值,calloc会初始化为0
char *pch = malloc(100); for (int i =0; i<100; i++) { printf("%d ",*(pch+i)); } printf("\n------------分割线-------------\n"); char *pch2 = calloc(1, 100); for (int i =0; i<100; i++) { printf("%d ",*(pch2+i)); }
三、realloc函数
/* 当自己手动开辟出来的空间不够用了,这个时候我们需要去扩容,就得用到realloc这个函数。 realloc: realloc(要扩容的空间首地址,操作后的字节大小); 作用:把你传入的空间进行扩容或者缩小,操作后的字节大小以后面的参数为准。 注意:用realloc函数的时候最好再用指针变量接收一下返回值。 因为你扩容的时候,很可能是系统帮你在一块新的足够大的空间里面进行扩容了,那样空间首地址就发生改变了。 */ //realloc的使用 char *p = malloc(100); *p = "的手机客户端还是把空间分布的刷卡缴费多少部分科技的设备房间号多少功夫空间都是给我看一个"; //所以要重新接收一下 p = realloc(p, 1000);//放大 p = realloc(p, 50);//缩小
四、内存泄露
/* 内存泄露: 内存容量有限,然后如果你不及时回收不要用的空间,而是一直开辟新的空间,那么内存就会不够用,就叫内存泄露(像水杯装水一样)。 代码里面:某块空间一直占据,没被回收就叫内存泄露。 回收自己开辟的堆空间: free: free(要回收的空间首地址); 野指针:指向的是已被回收的空间的指针叫野指针。指向不可用的内存空间叫野指针。 防止野指针: 就是在回收后,立即将指针变量置为NULL。 */ int *p = malloc(4);//内存泄露 //因为没有对p指向的堆空间进行回收,所以就内存泄露 //那么程序自己怎么回收?? free(p);//此时p指向的空间首地址就被回收了,此时p变为野指针 p = NULL; //p指向的空间被回收后,要立即把p置为NULL,防止野指针错误