C语言形参为(*array)[col]的二维数组如何获取行数及实际元素数
问题1:获取二维数组总行数(示例中为10)
C语言中数组传参会退化为指针,本身不会携带原始数组的长度信息,针对你当前的代码场景有两种可行方案:
- 方案1:直接复用全局宏
你当前代码中row是全局宏定义,直接在get2DLen函数中访问row宏即可得到总行数10,无需额外修改传参逻辑,适配现有代码的写法如下:
int get2DLen(char (*array)[col]){ int total_row = row; // 直接读取全局宏即可得到总行数 // 其他业务逻辑 }
- 方案2:传参时携带行数(更通用,不依赖全局宏)
如果需要函数适配不同行数的二维数组,可修改函数签名新增行数参数:
修改后的函数定义:
int get2DLen(char (*array)[col], int total_row){ // 直接使用传入的total_row参数即可 }
调用时传值:
int len = get2DLen(array, row);
问题2:获取数组实际有效元素个数(示例中为3)
你之前遍历判断\0的方案是逻辑错误导致不可行,正确逻辑如下:
C语言中初始化列表长度小于数组总长度时,剩余未显式初始化的元素会被自动置0,也就是示例中第4行及之后的行首元素都是\0,逐行判断首元素是否为\0,计数到第一个首元素为\0的行停止即可得到有效个数。
实现代码如下:
int get2DLen(char (*array)[col]){ int count = 0; // 遍历上限为总行数,避免数组越界 for(int i = 0; i < row; i++){ if(array[i][0] == '\0'){ break; } count++; } return count; // 示例中返回值为3 }
如果你的业务场景需要将空字符串(首元素为\0的行)作为有效元素存储,上述方案不适用,可选择两种替代方案:
- 初始化数组时主动在最后一个有效元素后添加自定义哨兵标记,比如约定
"__END_FLAG__"作为结束标记,遍历到该标记行停止计数 - 新增参数传入有效元素个数,在调用方维护有效长度值
内容的提问来源于stack exchange,提问作者z2ouu
相关产品推荐
相关产品推荐

