假设我有以下代码
#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