前言
座右铭:talk is easy,show me the code.
我们生活在幸福的时代,我们都站在巨人的肩膀上看世界
手把手教你如何用malloc申请动态内存
一点儿小故事
你有没有像我一样曾经这样申请内存:
int **a=(int **)malloc(n*sizeof(int ));
这样是不行的,int**类型的变量只能指向存放int*类型的数据内存单元
曾经我也如此疯狂过啊~
为什么要申请动态内存?
在C语言中,数组必须是定长的申请内存,不允许出现a[n]这样的情况,n不允许为变量,而动态申请内存却可以弥补这一缺点,不仅如此,通过申请动态内存,我们还可以申请多维内存,在做一些题目的时候数组无法通过,通过动态申请内存的数组却可以通过。
申请一维动态内存(连续的)
相信大家都知道如何使用malloc的,不懂的点击下方的链接了解一下?
malloc的一些使用方法
相信大家都可以理解这里,不再赘述。
#include<stdio.h>
#include<malloc.h>
int main()
{
int *a;
int n;
//输入你要存放多少个元素
scanf("%d",&n);
//申请足够存放n个元素的内存单元
a=(int *)malloc(n*sizeof(int));
for(int i=0;i<n;i++)
{
scanf("%d",a+i);
printf("%d\n",a[i]);
}
return 0;
}
动态申请二维数组(连续的)
我们以申请一个m行n列的数组为例。
int **a=(int **)malloc( m *sizeof(int *));
这一行相当于申请行内存
a[i]=(int *)malloc(n * sizeof(int *));
这一行相当于为第i+1行申请n列元素
在这里插入图片描述;
示例
#include<stdio.h>
#include<malloc.h>
int main()
{
int m ,n;
scanf("%d%d",&m,&n);
//申请行元素
int **a=(int **)malloc(m*sizeof(int *));
for(int i=0;i<m;i++)
{
//申请第i+1行的m个元素
a[i]=(int *)malloc(n*sizeof(int *));
for(int j=0;j<n;j++)
{
a[i][j]=i*10+j;
}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
printf("%2d ",a[i][j]);
}
printf("\n");
}
return 0;
}
运行结果
例题拓展
通过上例我们可以看几个竞赛例题来活学活用一下。
用malloc解题
由于水平有限,本博客难免有不足,恳请各位不吝赐教!