如何在C函数中返回int [N] *

时间:2018-12-07 07:11:29

标签: c

使用形式参数,我可以声明类型int[N]*的指针(在下面的代码中为int (*A)[COL])。但是我不知道如何将函数返回到这种类型的指针?

在我的代码中,int (*)[COL]没有任何意义。

非常感谢你。

int (*)[COL] creat_2D_Array(int(*A)[COL], int ROW, int COL) {
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            A[i][j] = rand() % 20 + 1;
        }
    }
    return A;
}
//I add some code below after discussion with user3386109

//Or how can i return to a pointer of int[10]*
int (*)[10] creat_2D_Array(int(*A)[10]) {
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            A[i][j] = rand() % 20 + 1;
        }
    }
    return A;
}

2 个答案:

答案 0 :(得分:1)

语法类似于函数指针,但是您只使用[...]而不是(...),例如:

type (*identifier)[size]

将函数名称和参数列表放在(* ... )内:

int (*creat_2D_Array(int (*A)[COL], int ROW, int COL_param))[COL] {
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            A[i][j] = rand() % 20 + 1;
        }
    }
    return A;
}

int (*creat_2D_Array_1(int(*A)[10]))[10] {
   for (int i = 0; i < 5; i++)
   {
       for (int j = 0; j < 10; j++)
       {
           A[i][j] = rand() % 20 + 1;
       }
   }
   return A;
}

第一个COL函数中的creat_2D_Array必须是一个常量表达式。

有时我会使用void*指针,通过这些函数结合一个简单的VLA声明(在函数参数列表内)来返回指向此类函数的未知大小数组的指针,并期望调用方进行强制转换:

  void *creat_2D_Array(int ROW, int COL, int A[ROW][COL]) {
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            A[i][j] = rand() % 20 + 1;
        }
    }
    return A;
}

int main() {
   int input[5][6];
   int (*output)[6] = creat_2D_Array(5, 6, input);
   // remember these are pointers, you return the same pointer you inputted
   assert(input == output);
}

我发现这种方法很难维护。为一些混淆的对象或结构编写一些访问API和函数更容易使用(并允许声明和其他检查)。

答案 1 :(得分:0)

您无法在C中返回数组。不幸的是,您也无法返回指向VLA的指针。

这是因为该函数在文件作用域中声明,并且您在那里不能拥有VLA,因为它需要具有静态存储持续时间。 C不允许这样做:

// illegal C, syntax error:
int (*create_2D_array(size_t ROW, size_t COL))[ROW][COL]; 

解决方案是使用指向数组的指针的指针,然后将其作为参数传递:

void create_2D_array (size_t ROW, size_t COL, int(**arr)[ROW][COL]);

示例:

#include <stdio.h>
#include <stdlib.h>

void create_2D_array (size_t ROW, size_t COL, int(**arr)[ROW][COL])
{
  *arr = malloc( sizeof(int[ROW][COL]) );

  int(*a)[COL] = **arr; // use tmp pointer to allow a[i][j] syntax
  for(size_t i=0; i<ROW; i++)
  {
    for(size_t j=0; j<COL; j++)
    {
      a[i][j] = i*COL + j;
    }
  }
}

int main (void)
{
  const size_t row = 3;
  const size_t col = 2;

  int(*arr)[row][col];
  create_2D_array(row, col, &arr);

  int(*a)[col] = *arr;
  for(size_t i=0; i<row; i++)
  {
    for(size_t j=0; j<col; j++)
    {
      printf("%d ", a[i][j]);
    }
    printf("\n");
  }

  free(arr);
  return (0);
}