前言
对于如何将未知数量的数组存放系统,可以用动态分配数组来解决,那么如果想将内存动态分配给一个未知大小的二维数组,该如何?
一、动态分配内存给一维数组
#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 常规参考代码
#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] 彩票摇奖
#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; }