C语言_0311笔记_指针:动态内存(C99之前)变化大小数组 动态内存分配/malloc后要free/注意事项

9.2.2 动态内存分配

C99里可以用变量定义数组大小,而C99之前人们使用动态内存分配

malloc函数

malloc(size_t size) ; 返回的类型是void* (因为类型是无法传递的),需要额外类型转换
  • 要使用该函数需要包含<stdlib.h>头文件

  • 向malloc申请的空间大小是以字节为单位,要申请多少,括号里写数量*sizeof(需要的类型int/short/double)

a=(int*)malloc(number*sizeof(int));
//因为malloc默认返回 void*,(int*) 是类型转换
  • 使用结束后要释放申请的空间,使用free()函数

  • 返回的结果是void*,需要转换为自己需要的类型(类型是人为将数值定义的种类)

  • eg:要申请数量为n,int类型的,返回类型为int*的空间给一个指针变量a

  • int *a; a=(int*)malloc(n*sizeof(int));

#include<stdio.h>
#include<stdlib.h>
 
int main(void)
{
        int number;
        int *a;
        int i;
         
        printf("请输入变量:");
        scanf("%d",&number);
        //C99可以直接写 int a[number];
         
        a=(int*)malloc(number*sizeof(int));
         
        //读入数据
        for(i=0;i<number;i++)
        {
            scanf("%d",&a[i]);
        }
        //倒序输出(从下标-1即最大值开始输出)
        for(i=number-1;i>=0;i--)
        {
            printf("%d",a[i]);
        }
        free(a);//申请了一块空间,现在需要释放。程序将指针当作数组用,所以直接释放a即可
         
        return 0;
 
}

申请失败

  • 如果申请内存失败则会返回0(或者称为NULL)

#include<stdio.h>
#include<stdlib.h>
 
int main(void)
{
void *p;
int cnt=0;
 
while((p=malloc(100*1024*1024)))//每次申请100M的空间 交给p
//malloc(100*1024*1024)
//(p=malloc(100*1024*1024))  看malloc的结果是不是0,是1的话while就执行
{
    cnt++;
}
 
printf("分配了%d00MB的空间\n",cnt);//14600
 
return 0;
}
while((p=malloc(100*1024*1024)))
这条语句同时做了两件事,第一:申请100MB空间给p;第二:将p值作为while条件
这样在申请失败,也就是没有可申请空间时循环停止,可以得出系统最大可分配的内存值。

free()

  • 俗话说有借有还,再借不难,free函数的作用就是将借来的内存空间还给系统,

  • 只能还申请来的空间的首地址!!!//p++了 不能free

  • 申请过的空间最终都是需要还回去的 原封不动!

  • free(NULL);

  • 完全没问题,相当于啥也没做。

  • 或者是形成一个习惯:定义指针时,先给指针赋0值。如果没有申请或者申请失败,此时就free(NULL,free(0)

常见问题

  • 申请了却没有free

  • 后果是长时间运行内存会逐渐减少

  • 新手可能是忘记了

  • 进阶者可能是找不到合适的free时机

free了多次

  • 会崩溃

地址改变后直接free

  • 比如申请的是指针p,执行free(p++)会提示p++所指的变量没有申请

  • 因此有一个malloc就要配套一个free。需要对程序结构有一定的规划,还需要一些经验。

猜你喜欢

转载自blog.csdn.net/Shmily_as33/article/details/129464224