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

C语言获取二维方阵维度异常:函数返回错误,宏结果正确

问题原因与解决方案

为什么函数返回错误结果?

当你把二维数组table传入get_table_size函数时,数组会自动退化为指向其首元素的指针。在64位操作系统中,指针的大小是8字节;而table被声明为char*类型,table[0]是单个char,大小为1字节。所以函数里的计算是8 / 1 = 8,这就是返回8的原因。

为什么宏能正确工作?

SIZE宏是在编译阶段直接展开执行的,它直接操作原数组变量。sizeof(table)计算的是整个5×5二维数组的总字节数(5×5=25字节),sizeof(table[0])计算的是数组中一行的字节数(5字节),25 / 5 = 5,因此能得到正确的方阵大小。

修复函数的方法

如果你想用函数实现这个功能,可以利用C99及以后支持的特性,或者明确指定数组的列数:

  1. 指定列数的版本:
int get_table_size(char table[][5])
{
    return sizeof(table) / sizeof(table[0]);
}
  1. 更通用的指向数组的指针版本:
int get_table_size(char (*table)[5])
{
    return sizeof(table) / sizeof(table[0]);
}

如果需要支持任意大小的方阵,最灵活的方式还是直接使用SIZE宏,或者在调用函数时手动传递数组大小——因为运行时无法通过退化的指针获取原数组的长度信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:22:39