hanghanga 发表于 2023-11-9 20:28:19

29课的课后题的疑问

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

void func(int b[]);

void func(int b[])
{
      printf("%d\n", b);
}

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

      func(a);

      return 0;
}

isdkz 发表于 2023-11-9 20:29:40

这个错误是由于函数声明和定义中的数组维度不匹配导致的。

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

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

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

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

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

修改后的代码如下:

#include <stdio.h>

void func(int b[]);

void func(int b[])
{
    printf("%d\n", b);
}

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

    func(a);

    return 0;
}


这样修改后,代码应该可以正确编译和运行,并输出11 。

hanghanga 发表于 2023-11-9 20:32:21

isdkz 发表于 2023-11-9 20:29
这个错误是由于函数声明和定义中的数组维度不匹配导致的。

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

关键是课后题的答案为什么没说会报错,并且返回了9.就是已经自动做了转换,且不会报错。

妖娆乌龙茶 发表于 2023-11-10 16:03:51

不能改成b,这题想考你的就是当传入参数的列数不同的时候,b会是什么值。 即实参传给形参的时候,会变成形参的列数。
报错就是因为维度不匹配,至于为什么小甲鱼没有说会报错。我认为是因为小甲鱼课后非动动手的测试题,侧重考的自己读程序来理解,目的不同。


希望能给个最佳回答!

hanghanga 发表于 2023-11-10 19:39:03

妖娆乌龙茶 发表于 2023-11-10 16:03
不能改成b,这题想考你的就是当传入参数的列数不同的时候,b会是什么值。 即实参传给形参的时 ...

可是小甲鱼的答案是9啊

妖娆乌龙茶 发表于 2023-11-13 09:36:08

hanghanga 发表于 2023-11-10 19:39
可是小甲鱼的答案是9啊

答案是9呀   

123   4          形参是b[]所以变成了3列的    12   3    在这个数组里b,第3行的第3列不就是9了?
567   8                                                      4   56
9 10 11 12                                                       7   89
                                                                      10 11 12

hanghanga 发表于 2023-11-13 22:42:58

妖娆乌龙茶 发表于 2023-11-13 09:36
答案是9呀   

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

按照小甲鱼的答案的写法是报错,不是9啊

妖娆乌龙茶 发表于 2023-11-14 09:17:15

hanghanga 发表于 2023-11-13 22:42
按照小甲鱼的答案的写法是报错,不是9啊

就是会报错呀,报错就是因为维度不匹配,正常不能这样设置实参的
页: [1]
查看完整版本: 29课的课后题的疑问