gpt4 book ai didi

c++ - 为 int[][] C/C++ 传入 int*

转载 作者:行者123 更新时间:2023-12-01 14:35:04 24 4
gpt4 key购买 nike

假设我有以下代码

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

用显式转换替换 C 语言中存在的隐式转换,让 C++ 编译器知道您打算绕过类型系统。

关于c++ - 为 int[][] C/C++ 传入 int*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63158186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com