鱼C论坛

 找回密码
 立即注册
查看: 709|回复: 7

29课的课后题的疑问

[复制链接]
发表于 2023-11-9 20:28:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个代码是29课的课后题,小甲鱼答案是9,但是在我的电脑上会报错:cannot convert 'int (*)[4]' to 'int (*)[3]'
请问这是怎么回事?怎样修改?只能改成 void func(int b[3][4]);么?
  1. #include <stdio.h>

  2. void func(int b[][3]);

  3. void func(int b[][3])
  4. {
  5.         printf("%d\n", b[2][2]);
  6. }

  7. int main(void)
  8. {
  9.         int a[][4] = {
  10.                 {1, 2, 3, 4},
  11.                 {5, 6, 7, 8},
  12.                 {9, 10, 11, 12}
  13.         };

  14.         func(a);

  15.         return 0;
  16. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-9 20:29:40 | 显示全部楼层
这个错误是由于函数声明和定义中的数组维度不匹配导致的。

在函数声明  void func(int b[][3]);  中,参数  b  被声明为一个二维数组,其中第一维的大小未指定,而第二维的大小为 3。

在函数定义  void func(int b[][3])  中,参数  b  被定义为一个二维数组,其中第一维的大小为 3,而第二维的大小为 3。

然而,在  main  函数中,数组  a  被声明为一个二维数组,其中第一维的大小为 3,而第二维的大小为 4。

因此,当你调用  func(a);  时,传递给函数的数组  a  的类型为  int (*)[4] ,而函数  func  期望的类型是  int (*)[3] ,两者不匹配,所以编译器报错。

为了解决这个问题,你可以修改函数声明和定义中的数组维度,使其与  a  数组的维度匹配。你可以将函数声明改为  void func(int b[][4]); ,并将函数定义改为  void func(int b[][4]) ,然后重新编译运行代码。

修改后的代码如下:

  1. #include <stdio.h>

  2. void func(int b[][4]);

  3. void func(int b[][4])
  4. {
  5.     printf("%d\n", b[2][2]);
  6. }

  7. int main(void)
  8. {
  9.     int a[][4] = {
  10.         {1, 2, 3, 4},
  11.         {5, 6, 7, 8},
  12.         {9, 10, 11, 12}
  13.     };

  14.     func(a);

  15.     return 0;
  16. }
复制代码


这样修改后,代码应该可以正确编译和运行,并输出  11 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-9 20:32:21 | 显示全部楼层
isdkz 发表于 2023-11-9 20:29
这个错误是由于函数声明和定义中的数组维度不匹配导致的。

在函数声明  void func(int b[][3]);  中,参 ...

关键是课后题的答案为什么没说会报错,并且返回了9.就是已经自动做了转换,且不会报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-10 16:03:51 | 显示全部楼层
不能改成b[3][4],这题想考你的就是当传入参数的列数不同的时候,b[2][2]会是什么值。 即实参传给形参的时候,会变成形参的列数。
报错就是因为维度不匹配,至于为什么小甲鱼没有说会报错。我认为是因为小甲鱼课后非动动手的测试题,侧重考的自己读程序来理解,目的不同。


希望能给个最佳回答!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-10 19:39:03 | 显示全部楼层
妖娆乌龙茶 发表于 2023-11-10 16:03
不能改成b[3][4],这题想考你的就是当传入参数的列数不同的时候,b[2][2]会是什么值。 即实参传给形参的时 ...

可是小甲鱼的答案是9啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-13 09:36:08 | 显示全部楼层
hanghanga 发表于 2023-11-10 19:39
可是小甲鱼的答案是9啊

答案是9呀   

1  2  3   4          形参是b[][3]所以变成了3列的    1  2   3    在这个数组里b[2][2],第3行的第3列不就是9了?
5  6  7   8                                                        4   5  6
9 10 11 12                                                       7   8  9
                                                                      10 11 12
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-13 22:42:58 | 显示全部楼层
妖娆乌龙茶 发表于 2023-11-13 09:36
答案是9呀   

1  2  3   4          形参是b[][3]所以变成了3列的    1  2   3    在这个数组里b[2][2 ...

按照小甲鱼的答案的写法是报错,不是9啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-14 09:17:15 | 显示全部楼层
hanghanga 发表于 2023-11-13 22:42
按照小甲鱼的答案的写法是报错,不是9啊

就是会报错呀,报错就是因为维度不匹配,正常不能这样设置实参的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-28 23:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表