C "warning: initialization from incompatible pointer type" 当函数有一个数组作为参数时
C "warning: initialization from incompatible pointer type" when function has an array as an argument
我正在尝试让一组指针函数工作。但是,我注意到,当函数的参数之一是数组类型时,我会收到错误消息。我不知道为什么我一直收到错误
错误信息
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
void (*p[1])(int, int, int) = { mini };
代码
// function prototype
void min(int row, int col, const int arr[row][col]);
void(*p[1])(int, int, const int) = { min}; // error happens here
int main() {
// rest of code
}
谢谢!
你的函数指针是const int
,你的函数是int [][]
,它们是不一样的。您必须改用 const int (*)[]
。
如果您正确地将 void(*p[1])(int, int, const int)
声明为:
,您的错误就会消失
void(*p[1])(int, int, const int (*)[]) = {min};
您尝试声明为数组元素类型目标的函数类型的第三个参数是 const int
的二维可变长度数组。但是,在您的数组声明中,您尝试将其声明为单个 const int
。这些不兼容。
最清晰的声明方式是这样的:
void(*p[1])(int, int, const int[*][*]) = { min };
或者像这样:
void(*p[1])(int, int, const int[][*]) = { min };
。两者是等价的。数组维度中的 *
表示未知大小的 VLA -- 未知是因为它取决于其他参数。数组参数的第一个维度(仅)总是可以省略,我通常更喜欢省略它,但在这种情况下我更喜欢第一个声明,因为即使编译器忽略第一个数组维度,人类读者也很清楚那也是一个可变维度。
编译器发出此警告消息是因为您正试图用 void (int, int, const int (*)[col])
类型的 min
初始化类型 void (*)(int, int, const int)
的数组指针 p
的第一个成员。 检查两种类型的第三个参数的区别。
要修复此警告消息,您可以执行以下操作:
void(*p[1])(int row, int col, const int arr[row][col]) = {min};
此外,如果数组只包含一个成员,则不需要函数指针数组。在那种情况下,你可以简单地做:
void(*p)(int row, int col, const int arr[row][col]) = min;
我正在尝试让一组指针函数工作。但是,我注意到,当函数的参数之一是数组类型时,我会收到错误消息。我不知道为什么我一直收到错误
错误信息
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
void (*p[1])(int, int, int) = { mini };
代码
// function prototype
void min(int row, int col, const int arr[row][col]);
void(*p[1])(int, int, const int) = { min}; // error happens here
int main() {
// rest of code
}
谢谢!
你的函数指针是const int
,你的函数是int [][]
,它们是不一样的。您必须改用 const int (*)[]
。
如果您正确地将 void(*p[1])(int, int, const int)
声明为:
void(*p[1])(int, int, const int (*)[]) = {min};
您尝试声明为数组元素类型目标的函数类型的第三个参数是 const int
的二维可变长度数组。但是,在您的数组声明中,您尝试将其声明为单个 const int
。这些不兼容。
最清晰的声明方式是这样的:
void(*p[1])(int, int, const int[*][*]) = { min };
或者像这样:
void(*p[1])(int, int, const int[][*]) = { min };
。两者是等价的。数组维度中的 *
表示未知大小的 VLA -- 未知是因为它取决于其他参数。数组参数的第一个维度(仅)总是可以省略,我通常更喜欢省略它,但在这种情况下我更喜欢第一个声明,因为即使编译器忽略第一个数组维度,人类读者也很清楚那也是一个可变维度。
编译器发出此警告消息是因为您正试图用 void (int, int, const int (*)[col])
类型的 min
初始化类型 void (*)(int, int, const int)
的数组指针 p
的第一个成员。 检查两种类型的第三个参数的区别。
要修复此警告消息,您可以执行以下操作:
void(*p[1])(int row, int col, const int arr[row][col]) = {min};
此外,如果数组只包含一个成员,则不需要函数指针数组。在那种情况下,你可以简单地做:
void(*p)(int row, int col, const int arr[row][col]) = min;