【问题标题】:array pointer type for function return函数返回的数组指针类型
【发布时间】:2021-05-30 13:24:36
【问题描述】:

我最近开始大量使用数组指针,因为它大大简化了分配/解除分配,但是当它作为函数的返回类型时,编译器总是会抛出错误。 这是被接受的:

int (*arr_ptr)[SIZE] = NULL;

但这不是:

int (*)[] foo(void) {
    return NULL;
}

编译器抛出此错误:

src/main.c:51:7: error: expected identifier or ‘(’ before ‘)’ token
   51 | int (*)[] foo(void) {
      |       ^

目前我只是 typedef 类型并且它可以工作:

typedef int(*tdarr_ptr_int)[];
tdarr_ptr_int foo(void) {
    return NULL;
}

但这对我来说不是一个合适的长期解决方案,我怎样才能指定这个返回类型而不必 typedef 呢?

【问题讨论】:

  • 您不能在 C 中返回数组。不过,您可以返回指针或结构,或者只是将数组(可能是 VLA)作为函数参数传递。
  • typedef 是一个很好的解决方案,不清楚为什么你会认为它不如替代方案合适
  • @Bob__ 我正在返回一个指针,一个指向数组的指针。
  • @MM 因为我可以只输入int(*arr)[SIZE] = malloc(sizeof(int)*SIZE*SIZE);,它给了我一个 SIZE * SIZE 的二维数组,就像你用 int arr[SIZE][SIZE]; 定义一个数组一样,但现在它被分配了,并且可以用一个函数返回它,然后用一个 free 来释放它,并且不必制作一个数组数组,这在更高维度上释放是很痛苦的。
  • @M.M Hoooo 我明白了,是的,我会这样做,所以如果我理解正确,我会输入类似:arr_t* foo(void);?

标签: arrays c types


【解决方案1】:

C 使用中缀表示法,正如我们从您的第一个示例中看到的那样:

int (*arr_ptr)[SIZE] = NULL;

是正确的,而

int (*)[SIZE] arr_ptr = NULL;

不是。您可以通过应用相同的原理来修复函数版本:

int (*foo(void))[] {

注意。人们有时会批评中缀,说后缀更容易,但希望从这个例子中可以清楚地看出,唯一的区别是标识符的位置,事实上,将标识符放在中缀位置可以帮助你看到中间在哪里:)

【讨论】:

  • 谢谢!编译器不再抛出错误,这是我没有尝试过的唯一解决方案。但这并不是很优雅……我想我会坚持使用 typedef,我发现它更具可读性。
猜你喜欢
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多