各个动态内存函数的使用条件!
1.动态内存的分配:
对于下列代码,所申请的空间是固定的:
int num=10; //向内存申请4个字节
int arr[10]={0}; //向内存申请40个字节
但是对于数组arr[10],已经申请40个字节的空间,如果部分没有使用就会造成浪费,或者有可能不够,就得使用更多的空间,所以动态内存分配的存在,显得非常重要!!
对于上述的开辟的空间的方式,有两个特点:
1.空间开辟的大小是固定的!!
2.数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配!!
但是,对于空间的需求,不仅仅时上述的情况,有时候,我们需要的空间大小,在程序运行的时候才能知道,那数组的编译时 ,开辟空间的方式就不能满足了!!
因此,基于上述种种原因。动态内存开辟显得尤为重要!!
下面进入:malloc动态内存开辟函数的详解!!
使用语法为:
void* malloc (size_t size)
size_t 是指:无符号的整型!!
size: 是指:大小,单位为字节
malloc 这个函数,向内存申请size个字节的空间,然后将申请的空间的起始地址返回!!
但是,上述的返回类型为什么是:void*类型呢??
原因在于:只申请了size个字节的大小,并没有指明内存中放什么类型的数据!导致不知道用什么类型的指针来维护这个空间合适!!所以,返回的是void* 的指针!!
malloc 函数所需要的头文件为: #include <stdlib.h>
下面请看,使用案列:
#include <stdio.h> #include <stdlib.h> int main() { int arr[10] = { 0 }; //向内存申请了10*4=40个字节的空间 void* p = malloc(40); //40字节 }
在上面的void* p = malloc(40)中,向内存申请了40个子节的空间!malloc会返回一个地址,将这个地址放到void*的指针里面!!
若将malloc 开辟的40个空间里面放入10个整型!需要强制类型转化;代码书写情况为:
int* p = (int*)malloc9(40);
这个就是需要将malloc开辟的void*类型的指针强制类型转换为:int *类型的指针!!
但是,对于malloc开辟空间失败,则会返回一个空指针(NULL)!一般情况下,开辟空间都会成功,很少有失败的案列(开辟一个很大的空间,可能会失败)
开辟空间的代码使用情况:
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> int main() { //int arr[10]={0}; //向内存申请40个字节的空间 int* p = (int*)malloc(40); int* ptr = p; if (ptr == NULL) { printf("%s\n", strerror(errno)); return 1; } //使用 int i = 0; for (i = 0; i < 10; i++) { *ptr = i; ptr++; } //释放 free(p); //关于free()的用法,大家先不用知道,在后续会有讲解!! p = NULL; }
上述的代码,仅仅是为了向各位老铁介绍一下如何使用malloc函数!并不做其他作用,所以,在最后,笔者也没有进行用printf函数来打印出来代码!!
1.int* ptr = p; 如果不这样进行,在后面会有进行p++的部分,此时,p已经不再是初始地址,在进行free(p)会报错!!对于free()函数,只需要知道是释放动态开辟空间内存的就可以,其他的在后续博客有更新!!
对于malloc 是C语言提供的一个动态内存开辟函数!
void* malloc (size_t size)
这个函数向内存申请一块连续可用的空间,并且返回指向这块空间的指针!!
1.如果开辟成功,则返回一个指向这个开辟好空间的起始地址
2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查!!
3.返回值的类型为:void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候,由使用者自己决定!!
4.如果参数size为0,malloc的行为是标准为定义的,取决于编译器!!