【C语言】动态分配内存给一维、二维数组

前言

对于如何将未知数量的数组存放系统,可以用动态分配数组来解决,那么如果想将内存动态分配给一个未知大小的二维数组,该如何?

一、动态分配内存给一维数组

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;
}
相关推荐
·云扬·1 小时前
【Leetcode hot 100】101.对称二叉树
算法·leetcode·职场和发展
西阳未落1 小时前
C语言中的内存函数(memcpy, memmove, memcmp, memset)
c语言·开发语言
axban3 小时前
QT M/V架构开发实战:QFileSystemModel介绍
开发语言·qt·架构
钢门狂鸭5 小时前
关于rust的crates.io
开发语言·后端·rust
Lionel_SSL6 小时前
《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理
java·开发语言·jvm
Greedy Alg6 小时前
LeetCode 142. 环形链表 II
算法
睡不醒的kun6 小时前
leetcode算法刷题的第三十二天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
技术猿188702783516 小时前
PHP 与 WebAssembly 的 “天然隔阂”
开发语言·php·wasm
薄荷撞~可乐6 小时前
C#Task(Api)应用
开发语言·c#
范纹杉想快点毕业7 小时前
ZYNQ PS 端 UART 接收数据数据帧(初学者友好版)嵌入式编程 C语言 c++ 软件开发
c语言·笔记·stm32·单片机·嵌入式硬件·mcu·51单片机