C语言 如何从函数返回二维数组

u0njafvf  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(139)

我试图从函数返回一个2d数组。它是这样的

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

我知道这是一个错误,需要帮助。谢谢

hmae6n7t

hmae6n7t1#

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!
}

使用结构体 Package

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

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

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

lmvvr0a82#

这听起来像是你想要一个 * 函数返回指向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...
sz81bmfz

sz81bmfz3#

试试这个,在我的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;
}

相关问题