c语言如何输入二维数组:三种常用写法对比
c语言如何输入二维数组,主流有固定大小数组循环scanf、动态分配内存输入、指针数组模拟二维数组三种方式,固定大小循环写法适合初学、笔试场景,动态分配适合行列数量在运行时才确定的场景,指针数组写法灵活性更高,但要手动管理内存,新手优先掌握第一种,C89标准不支持变长数组直接初始化,变长数组仅在C99及之后版本支持。
固定行列二维数组循环输入
你先定义行和列的常量,再嵌套两层for循环,外层循环遍历每一行,内层循环读取该行里的每一个元素,scanf直接读取整数存入数组对应位置,下标顺序为arr[i][j],i代表行号,j代表列号。标准示例代码可以写成intarr[3][4];for(inti=0;i<3;i++){for(intj=0;j<4;j++){scanf("%d",&arr[i][j]);}},输入的时候连续输入12个数字,空格或者回车分隔都可以,scanf会自动跳过空白符。
下标顺序不能颠倒。
这种写法编译兼容性好,绝大多数在线OJ、教材、考试环境都能正常运行,数组占用的内存空间在编译阶段就确定,不需要调用malloc、free函数,内存泄漏风险较低。它的局限也很明确,行列数值写死在代码里,运行过程中无法修改数组规模,适合题目明确给出行列数量、数据规模固定的场景。
C99变长数组输入
你先通过scanf读取用户输入的行数、列数,再用读取到的变量直接定义二维数组,接着继续嵌套循环读取元素,代码形式为intm,n;scanf("%d%d",&m,&n);intarr[m][n];for(inti=0;i
变长数组不用手动释放内存,函数执行结束后内存自动回收,代码简洁,不需要复杂的内存操作。但它的内存分配在栈区,栈空间容量有限,当行列数值很大时,很容易触发栈溢出,程序直接崩溃,一般不建议用来处理上万规模的数据。
动态分配二维数组输入
| 输入方式 | 内存区域 | 是否需要手动free | 适合场景 |
|---|---|---|---|
| 固定大小数组 | 栈区 | 否 | 行列固定、初学刷题 |
| C99变长数组 | 栈区 | 否 | 行列可变、数据量偏小 |
| malloc动态分配 | 堆区 | 是 | 行列可变、大数据量 |
动态分配的思路是先申请一块指针数组存放每一行的起始地址,再循环为每一行单独申请一维内存,读取元素的循环逻辑和前面两种保持一致,读取完成之后,需要先释放每一行的内存,再释放存储行地址的指针数组,释放顺序不能颠倒。如果只申请不释放,长期循环调用会出现内存泄漏。
堆区内存上限远大于栈区,能够承载更大规模的二维数据,行列完全由运行时输入决定,灵活性最强,工程开发中使用较多。它的门槛更高,你需要理解指针、堆内存生命周期,忘记释放或者释放顺序出错,都会带来程序异常。
输入时的常见错误,是scanf里漏掉取地址符&,直接写arr[i][j],这个写法会传递元素值而不是地址,scanf无法写入数据,程序运行时大概率直接卡死。
该方法的适用边界是,所有栈上分配的二维数组,包括固定数组和变长数组,都不适合处理单维度超过一千的大容量数据,大容量数据优先选择堆区动态分配方案。
