【发布时间】:2020-11-19 07:32:36
【问题描述】:
假设我有以下代码
#include <stdio.h>
#include <stdlib.h>
int foo(int bar[3][3]){
return bar[1][1];
}
int main(){
int* bar = (int*) malloc(9 * sizeof(int));
for(int i = 0; i < 9; i++){
bar[i] = i;
}
int test = foo(bar);
printf("%d\n", test);
}
用 C 编译会给出警告
warning: incompatible pointer types passing 'int *' to parameter of type 'int (*)[3]' [-Wincompatible-pointer-types]
int test = foo(bar);
但仍然输出 4 的预期结果(虽然我认为警告是 UB 的标志)
用 g++ 编译会报错
error: no matching function for call to 'foo'
int test = foo(bar);
note: candidate function not viable: no known conversion from 'int *' to 'int (*)[3]' for 1st argument
int foo(int bar[3][3]){
我无法更改 bar 的函数签名,但只想传入一个指向数组的简单指针。什么是最简单的代码类型转换/更改,可以在没有 UB 的情况下使用 g++ 进行编译。这是针对我在查看 bar 的函数签名时使用 Python 脚本生成的代码,因此解决方案越简单越好。 (这只是一个例子)
【问题讨论】:
-
你的意思是
foo的函数签名吗?bar是foo参数的(可选)名称(也是main的本地名称) -
一个数组衰减到一个指针,但不是相反。
-
拜托,拜托,please 停止使用 C 风格的数组(和
malloc)。只需使用std::array或std::vector。 请。 -
@JesperJuhl 这段代码似乎是用 C 和 C++ 编译器编译的,所以 STL 几乎不是一个选项。
-
@Ayxan 它被标记为“c++”。我就这样过去了。
标签: c++ c pointers multidimensional-array