passing in int* for int[][] C/C++



假设我有以下代码

#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("%dn", 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(reinterpret_cast<int(*)[3]>(bar)); // C++ only
foo((int(*)[3])bar); // C and C++

将C语言中存在的隐式强制转换替换为显式强制转换,以使C++编译器知道您打算绕过类型系统。

没有动态内存分配:

int main(void) {
int bar[3][3];
for (int i=0; i<9; ++i) {
bar[i / 3][i % 3] = i;
}
printf("%dn", foo(bar));
}

带:(C(

int main(void) {
int (*bar)[3] = malloc(3 * sizeof(int[3]));
for (int i=0; i<9; ++i) {
bar[i / 3][i % 3] = i;
}
printf("%dn", foo(bar));
}

什么是最简单的代码类型转换/更改,可以在没有UB的情况下使用g++进行编译

int main(){
int bar[3][3];
for(int i = 0; i < 9; i++){
bar[i / 3][i % 3] = i;
}
int test = foo(bar);
printf("%dn", test);
}

适用于C++和C

最新更新