【问题标题】:passing in int* for int[][] C/C++将 int* 传递给 int[][] C/C++
【发布时间】: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的函数签名吗? barfoo 参数的(可选)名称(也是main 的本地名称)
  • 一个数组衰减到一个指针,但不是相反。
  • 拜托,拜托,please 停止使用 C 风格的数组( malloc)。只需使用std::arraystd::vector
  • @JesperJuhl 这段代码似乎是用 C 和 C++ 编译器编译的,所以 STL 几乎不是一个选项。
  • @Ayxan 它被标记为“c++”。我就这样过去了。

标签: c++ c pointers multidimensional-array


【解决方案1】:

快速而肮脏的修复:

foo(reinterpret_cast<int(*)[3]>(bar)); // C++ only
foo((int(*)[3])bar); // C and C++

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

【讨论】:

  • 有什么方法可以绕过括号中的 3 吗?很容易做到,但我的正则表达式需要做一些额外的工作。
  • 不,尽管我认为我的担忧无法解决。为了编译,我将不得不以一种或另一种方式从函数签名中读取尺寸。感谢您的帮助,这将起作用!
  • @HashBr0wn C++没有变长数组,但有std::vectorEigen::Map
  • @HashBr0wn gcc.godbolt.org/z/rroK9q 怎么样
  • 我只是使用你的 C 和 C++ 修复
【解决方案2】:

什么是最简单的类型转换/代码更改,可以在没有 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("%d\n", test);
}

适用于 C++ 和 C

【讨论】:

    【解决方案3】:

    没有动态内存分配:

    int main(void) {
       int bar[3][3];
       for (int i=0; i<9; ++i) {
          bar[i / 3][i % 3] = i;
       }
    
       printf("%d\n", 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("%d\n", foo(bar));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      相关资源
      最近更新 更多