在main之外定义的函数内的main中分配数组

Allocate array in main inside a function which is defined outside of main

我正在尝试在函数内的数组上使用 calloc,但它不起作用。尝试调试时,我发现函数内部的指针指向分配的内存,但当离开函数时,它再次指向 NULL。尝试了各种变体,但似乎无法找到解决方案。

这是我的代码:

int main(int argc, char *argv[]) {
    int *rows = NULL, *solvedRows = NULL;
    int **board = NULL, **solvedBoard = NULL;
    allocateMemory(dim, &(*rows), &(*board));
    allocateMemory(dim, &(*solvedRows), &(*solvedBoard));
}

void allocateMemory(int dim, int** rows, int*** board) {
    rows = calloc(dim*dim,sizeof(int));
    board = calloc(dim, sizeof(int*));
    if (rows == NULL || board == NULL) {
        printf("Error: calloc has failed\n");
        exit(1);
    }
}

需要帮助以了解问题所在以及解决方法。

编辑

我试过了:

*rows = calloc(dim*dim,sizeof(int));
*board = calloc(dim, sizeof(int*));

仍然有同样的问题。

也尝试过:

allocateMemory(dim, &rows, &board);

for line 4 and (5 same) and in doesn't compile with the error: “错误:从不兼容的指针类型 [-Werror=incompatible-pointer-types] 传递 'allocateMemory' 的参数 2 分配内存(暗淡,&行,&板); ^" 错误:从不兼容的指针类型 [-Werror=incompatible-pointer-types] 传递 'allocateMemory' 的参数 3 分配内存(暗淡,&行,&板); ^

编辑

对于遇到此问题并查看此页面的任何人,最后一次尝试实际上是正确的,正如迈克尔在下面回答的那样。错误是对应头文件的错误,在修复头文件的时候修复了。

让我们关注您的 rows 变量:

rows是指针,是一个保存内存地址的变量。 现在您希望 alocateMemory 写入 rows 内存块的地址,以保存您的数据。足够简单:

size_d dim = 10;
int* rows = 0;
rows = calloc(1, sizeof(int) * dim);

但是,如果您将此代码放入函数中,例如

void allocateMemory(size_t dim, int* rows) {
    rows = calloc(1, sizeof(int) * dim);
}

现在如果你像这样调用这个函数

int* actualRows = 0;
allocateMemory(3, actualRows);

actualRows(即0)的将被复制到一个新的变量rows中,您在[=24]中操作=].当你写入行时,它的值会改变,但是当allocateMemory被留下时,rows就会被销毁。 actualRows 永远不会改变。

你想要的是 allocateMemory 设置 actualRows o 内存地址的值。为此,您必须向 allocateMemory 提供 actualRows 地址 ,例如

allocateMemory(3, &actualRows);

&atualRowsactualRows的内存地址,它的类型是int**(指向int的指针)。

现在您必须适当调整 allocateMemory 的签名:

void allocateMemory(size_t dim, int** rows) {
    rows = calloc(1, sizeof(int) * dim);
}

并且,由于 rows 现在是一个指针并且您想更改其目标,因此您需要在分配之前取消引用它:

*rows = calloc(1, sizeof(int) * dim);

总产量:

void allocateMemory(size_t dim, int** rows) {
    *rows = calloc(1, sizeof(int) * dim);
}

...
int* actualRows = 0;
allocateMemory(3, &actualRows);
...

你的board,原则上是一样的。尝试

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

void allocateMemory(int dim, int** rows, int*** board) {
    *rows = calloc(dim * dim,sizeof(int));
    *board = calloc(dim, dim * sizeof(int*));

    if (rows == NULL || board == NULL) {
        printf("Error: calloc has failed\n");
    }

    for(size_t i = 0; i < dim; ++i) {
        (*board)[i] = calloc(1, sizeof(int) * dim);

        if ((*board)[i] == NULL) {
            printf("Error: calloc has failed\n");
        }
    }

}

int main(int argc, char *argv[]) {

    size_t dim = 10;

    int *rows = NULL;
    int **board = NULL;
    allocateMemory(dim, &rows, &board);

    rows[0] = 10;
    rows[1] = 11;

    for(size_t i = 0; i < dim; ++i) {
        printf("%i ", rows[i]);
    }

    printf("\n\n\n");

    board[0][0] = 11;
    board[9][0] = 99;
    board[9][9] = 101;

    for(size_t i = 0; i < dim; ++i) {

        for(size_t k = 0; k < dim; ++k) {

            printf("%i ", board[i][k]);
        }
        printf("\n");
    }

    printf("\n");

    for(size_t i = 0; i < dim; ++i) free(board[i]);
    free(board);

    free(rows);
}