【问题标题】:Return a 2d array from a function从函数返回二维数组
【发布时间】:2012-01-26 22:07:22
【问题描述】:

我是 C 的新手。 我正在尝试从函数返回一个二维数组。 是这样的

int *MakeGridOfCounts(int Grid[][6])
{
  int cGrid[6][6] = {{0, }, {0, }, {0, }, {0, }, {0, }, {0, }};
  int (*p)[6] = cGrid;
  return (int*)p;
}

我知道这会导致错误,需要帮助。谢谢

【问题讨论】:

  • 请发布它导致的错误。此外,问题 #1 是您分配的数组在堆栈上,并且一旦函数返回就会消失。

标签: c


【解决方案1】:

C 语言有一个基本缺陷:不可能从函数返回数组。 有很多解决方法;我将描述三个。

用指向数组的指针替换

返回一个指针而不是数组本身。这导致了 C 语言中的另一个问题:当一个函数返回一个指向某个东西的指针时,它通常应该动态地分配这个东西。你不应该忘记稍后释放它(当不再需要数组时)。

typedef int (*pointer_to_array)[6][6];

pointer_to_array workaround1()
{
    pointer_to_array result = malloc(sizeof(*result));
    (*result)[0][0] = 0;
    (*result)[1][0] = 0;
    (*result)[2][0] = 0;
    (*result)[3][0] = 0;
    (*result)[4][0] = 0;
    (*result)[5][0] = 0;
    return result;
}

用指向 int 的指针替换

二维数组在内存中显示为一系列数字,因此您可以将其替换为指向第一个元素的指针。您明确表示要返回一个数组,但您的示例代码返回一个指向 int 的指针,所以也许您可以相应地更改其余代码。

int *workaround2()
{
    int temp[6][6] = {{0}}; // initializes a temporary array to zeros
    int *result = malloc(sizeof(int) * 6 * 6); // allocates a one-dimensional array
    memcpy(result, temp, sizeof(int) * 6 * 6); // copies stuff
    return result; // cannot return an array but can return a pointer!
}

用结构包装

这听起来很傻,但是函数可以返回结构,即使它们不能返回数组!即使返回的结构包含一个数组。

struct array_inside
{
    int array[6][6];
};

struct array_inside workaround3()
{
    struct array_inside result = {{{0}}};
    return result;
}

【讨论】:

  • 能否请您在用指向数组的指针替换示例中解释一下,sizeof result 是什么。
  • result 是指向数组的指针,因此 sizeof result 是指针的大小(对于任何指针,通常为 4 或 8 个字节)。我认为没有必要对sizeof result做任何解释,因为我的代码使用了sizeof(*result),也就是数组的大小。
【解决方案2】:

听起来你想要一个函数返回指向int数组[6]的指针

int (*makeGrid())[6]
{
     return calloc(6*6,sizeof(int)); //zeros the memory as in your example.
}

你可以这样调用和使用它:

int (*arr)[6] = makeGrid();
arr[4][3] = 3; //etc...

【讨论】:

    【解决方案3】:

    试试这个,在我的 mac 上用 GCC 编译得很好..

    typedef struct _intGrid_t{
        int **data;
        int width;
        int height;
    } *IntGrid;
    
    IntGrid makeGridWithSize(int width, int height);
    IntGrid makeGridWithSize(int width, int height)
    {
        IntGrid grid = malloc(sizeof(struct _intGrid_t));
    
        int **data = (int **) malloc(sizeof(int *) * width);
    
        for (int i = 0; i < width; i++) {
            data[i] = malloc(sizeof(int) * height);
    
            memset(data[i], 0, sizeof(int) * height);
        }
    
        grid->data = data;
        grid->width = width;
        grid->height = height;
    
        return grid;
    }
    
    void printGrid(IntGrid grid);
    void printGrid(IntGrid grid)
    {
        printf(" { \n");
        for (int i =0; i < grid->width; i++) {
            printf(" { ");
    
            for (int j = 0; j < grid->height; j++) {
                printf("%i", grid->data[i][j]);
    
                if (j != grid->height - 1)
                {
                    printf(", ");
                }
            }
    
            printf(" } \n");
        }
        printf(" } \n");
    }
    
    void freeGrid(IntGrid grid);
    void freeGrid(IntGrid grid)
    {
        for (int i = 0; i < grid->width; i++) {
            free(grid->data[i]);
        }
    
        free(grid->data);
        free(grid);
    }
    
    
    int main (int argc, const char * argv[])
    {
        srand((int) time(NULL));
    
        IntGrid grid = makeGridWithSize(10, 10);
    
    
        for (int i = 0; i < grid->width; i++) {
            for (int j = 0; j < grid->height; j++) {
                grid->data[i][j] = rand() % 10;
            }
        }
    
        printGrid(grid);
        freeGrid(grid);
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 1970-01-01
      • 2021-05-01
      • 2021-12-04
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多