malloc和free的语法格式
`malloc` 函数是 C 语言标准库中的一个重要函数,用于动态分配内存。其语法如下:
void *malloc(size_t size);
这里的 `void *` 表示返回的是一个 `void` 类型的指针,实际上这个指针指向的是一个 `char` 类型的内存块。`size_t` 是一个无符号整数类型,用于指定分配的内存大小。
当你调用 `malloc` 函数时,你需要提供一个参数 `size`,表示你需要分配的内存的大小(以字节为单位)。函数返回一个指针,指向为你分配的内存区域的开始位置。如果分配成功,这个指针不会是 `NULL`;如果分配失败(比如,系统没有足够的内存来满足请求),`malloc` 函数会返回 `NULL`。
在使用 `malloc` 分配的内存时,你需要使用 `memcpy`,`strcpy` 等函数来复制数据到这个内存区域,而不是 `strcpy`,`printf` 等函数,因为这些函数不适用于动态分配的内存。
在使用完动态分配的内存后,你应该使用 `free` 函数来释放内存,以避免内存泄漏。
free(void *ptr);
这里的 `ptr` 是之前 `malloc` 或其他动态内存分配函数(如 `calloc`,`realloc`)返回的指针。使用 `free` 后,指针所指向的内存将被释放,可以被系统重新分配给其他请求。但是,免费的内存不会立即变得可被其他程序使用,这是一个操作系统和硬件相关的过程。
这里是需要把这两个函数放到一起讲解的,因为申请内存空间你就得释放内存空间,不然会导致内存泄漏,内存泄漏会导致电脑内存里面可以使用的空间越来越少。最后导致崩盘。
———————————————————————————————————————————
malloc和free函数的使用
申请内存空间
返回函数 一定要做检查
头文件stdlib.h
perror打印出错误
动态内存的开辟空间都在堆区
释放内存
传递的参数 p就可以
解释一下
所以 此时释放的是自己的权限
但是需要知道的是 此时p也就是野指针了
所以此时我们把p栓到树上
也就是设置为空指针
———————————————————————————————————————————
这里开辟内存空间注意的三点(重点)
1
这里需要进行强制类型的转化因为从语法格式我们可以看出来,这里是的void*类型,也就是不明确的类型,为什么,因为C语言官方在设定的时候不清楚你开辟内存空间的目的是干什么用的,不知道是用于整数的存储,还是用于字符的打印,还是干什么。所以这里给出无返回类型,只需要你在使用的时候进行强制类型转化就可以。这样可以提升代码的兼容性和健壮性。
2.
对于空间的释放,释放空间之后尽量的让指针指向NULL,也就是空指针,因为当指针指向的空阿金释放之后,本质上他是不指向任何的数值了,也就是此时他是野指针了,虽然你不使用他了,但是最好指向空指针。防止内存的泄露
3.
使用空间的时候,你不能让指针跟着走,我们可以看到代码里面,
使用的是这个代码*(p+i)=I+1;。而不是*(p)=i;p++;这样的代码。
为什么,因为当指针走远之后,你进行释放空间的时候,本质上释放的是指针移动后指向的空间,你让指针一直移动,移动到开辟的空间的最后一个位置,然后再进行释放空间的时候,其实本质上释放的是开辟空间之后的空间,也就是没有释放空间。
你创建了空间,但是没有释放空间,此时会导致内存泄露。
内存泄露的问题我们也聊过,也就是内存占用少的时候还不明显,但是当有大量程序运行的时候,就会导致内存一直占用,但是得不到释放。从而导致崩盘。
4.
malloc函数里面放置的是字节大小,这里放置的是字节大小,不是bit大小,这里一定要记住。
———————————————————————————————————————————
malloc和free代码
int main()
{
//malloc不初始化开辟空间
//开辟20个字节的空间大小
int* p = (int*)malloc(5 * sizeof(int));
if (p == NULL)
{
perror("malloc:");//这里是打印错误信息,
return 1;
}
for (int i = 0; i < 5; i++)//这里是打印出来开辟的空间 赋值之后进行打印
{
*(p + i) = i + 1;//这里是进行赋值 赋值从1开始
printf("%d ", *(p + i));//这里是打印出来
}
free(p);//这里进行指针的释放
p = NULL;//防止野指针的问题,我们指向空指针
return 0;
}
malloc第两种写法
可以是sizeof(int)=四个字节
然后5*sizeof(int)=20个字节
第二种就是上述的写法malloc(20)