You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数参数double a[size][size]含义及两打印函数差异原因咨询

数组对角线打印函数的问题分析

一、double a[size][size]的含义

这是C99标准新增的**变长数组(VLA)**参数,它表示一个二维数组:

  • 数组的行数和列数都由参数size决定,size是运行时才能确定的变量,而非编译期固定的常量
  • 和固定大小的二维数组参数(比如第一个函数里的a[][101])不同,它的数组维度可以根据调用时传入的size动态变化

二、第二个函数无法工作的原因

问题出在递归调用的数组下标计算逻辑上:

  1. 第一个函数printDiag1的数组参数是double a[][101],这是固定列数的二维数组——C语言规定二维数组参数的第二维必须是编译时常量,此时数组每行的元素数固定为101。递归时不管size怎么变化,访问a[i][j]的地址计算规则都是起始地址 + i*101 + j,只要size不超过101,就能正确定位到对角线元素。
  2. 第二个函数printDiag2用了变长数组参数,递归调用printDiag2(size-1,a,row,col)时,新的函数栈里size变成了size-1,此时函数会默认传入的数组每行只有size-1个元素。但实际传入的数组还是原来的size x size数组,内存布局并没有改变。
    • 举个例子:假设最初调用size=3,数组是3x3,内存中每行有3个元素。递归到size=2时,函数会按每行2个元素来计算地址,此时访问a[1][1]的地址会被计算成起始地址 +1*2 +1 = 起始地址+3,但原来数组中a[1][1]的实际地址是起始地址+1*3+1=起始地址+4,直接导致访问了错误的内存位置,最终输出乱码或者程序崩溃。

内容的提问来源于stack exchange,提问作者shangq_tou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:01:33