传递二维数组第二行给storeTables函数为何返回错误结果?
问题分析与解决方案
先拆解代码出错的核心逻辑:
参数本质与内存越界原因
函数参数int arr[][10]会被编译器自动解析为int(*arr)[10](指向长度为10的int数组的指针)。当你传递&tables[1]时,arr指向的是tables数组的第二行(tables[1])。此时在函数里访问arr[1][i],相当于从arr的地址向后偏移1个int[10]的内存块,但tables总共只有2行(索引0、1),这个偏移直接指向了数组之外的非法内存,读写操作自然会得到随机值。
保留int arr[][10]参数的两种有效解法
解法一:调整调用时的n值
传递&tables[1]时,将n设为0——因为此时arr指向的第二行,本身就是这个"子数组"的第0行:
storeTables(&tables[1], 0, 2); // arr[0][i] 对应 tables[1][i] storeTables(tables, 0, 3); // arr[0][i] 对应 tables[0][i]
解法二:统一传递整个二维数组
直接传递tables(它会自动退化为指向第一行的指针),通过n指定要操作的行索引,这是更直观的写法:
storeTables(tables, 1, 2); // arr[1][i] 对应 tables[1][i] storeTables(tables, 0, 3); // arr[0][i] 对应 tables[0][i]
你尝试的其他方式无效的原因
&tables[0][1]是int*类型,和函数要求的int(*)[10]类型不匹配,编译器会直接报错;tables + 1和&tables[1]是同一个地址,本质逻辑完全一致,调用时n用1仍会触发内存越界。
内容的提问来源于stack exchange,提问作者Tanishk Nagda
相关产品推荐
相关产品推荐

