前言
对于如何将未知数量的数组存放系统,可以用动态分配数组来解决,那么如果想将内存动态分配给一个未知大小的二维数组,该如何?
一、动态分配内存给一维数组
cpp
#include<stdio.h>
#include<stdlib.h>
int main() {
//输入数组大小
int n;
scanf("%d", &n);
//分配内存
int* arr = (int*)malloc(sizeof(int) * n);
//输入数组元素
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
//输出数组元素
for (int j = 0; j < n; j++) {
printf("%d", arr[j]);
}
//释放内存
free(arr);
return 0;
}
二、动态分配内存给二维数组
2.1 常规参考代码
cpp
#include <stdio.h>
#include <stdlib.h>
int main()
{
int rows, cols;
scanf("%d", &rows);//行数
scanf("%d", &cols);//列数
// 分配指针数组的内存
int** arr = (int**)malloc(rows * sizeof(int*));
// 分配每行数组的内存
for (int i = 0; i < rows; i++) {
arr[i] = (int*)malloc(cols * sizeof(int));
}
// 输入数组元素
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
scanf("%d", &arr[i][j]);
}
}
//输出数组元素
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
//释放内存
for (int i = 0; i < rows; i++) {
free(arr[i]);
}
free(arr);
return 0;
}
2.2 应用案例
【洛谷】P2550 [AHOI2001] 彩票摇奖
cpp#include<stdio.h> #include<stdlib.h> int main(){ int n; scanf("%d",&n); //存入中奖号码 int a[7]; for(int i=0;i<7;i++){ scanf("%d",&a[i]); } //存入小明购买彩票的号码 int **b=(int**)malloc(sizeof(int*)*n); for(int s=0;s<n;s++){ b[s]=(int *)malloc(sizeof(int)*7); } for(int j=0;j<n;j++){ for(int k=0;k<7;k++){ scanf("%d",&b[j][k]); } } //判断中奖等级 int num[8]={0}; for(int p=0;p<n;p++){ int ret=0; for(int q=0;q<7;q++){ for(int s=0;s<7;s++){ if(b[p][q]==a[s]){ ret++; } } } num[ret]++; } //输出各个中奖等级的数量 for(int t=7;t>0;t--){ printf("%d ",num[t]); } //释放内存 for (int s = 0; s < n; s++) { free(b[s]); } free(b); return 0; }