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及以后支持的特性,或者明确指定数组的列数:
- 指定列数的版本:
int get_table_size(char table[][5]) { return sizeof(table) / sizeof(table[0]); }
- 更通用的指向数组的指针版本:
int get_table_size(char (*table)[5]) { return sizeof(table) / sizeof(table[0]); }
如果需要支持任意大小的方阵,最灵活的方式还是直接使用SIZE宏,或者在调用函数时手动传递数组大小——因为运行时无法通过退化的指针获取原数组的长度信息。
内容的提问来源于stack exchange,提问作者3nondatur
相关产品推荐
相关产品推荐

