在C中动态分配2D数组

时间:2016-01-25 00:25:59

标签: c arrays pointers multidimensional-array dynamic-memory-allocation

我一直在阅读并且我已经将我正在阅读的内容应用到我的代码中,但我不确定我是否遗漏了某些东西...... 2d数组假设要镜像数独。 我知道问题区域在我的arrayMake函数中。 我的教授建议使用带有malloc调用的强制转换: sudoku = (int**)malloc(sudokus*sizeof(int*));但这对我不起作用。

int main(){
    int sudokus;
    int** sudoku;
    sudokus = getUserInfo();
    sudoku = arrayMake(sudokus);
    /*for (int i = 0; i < (SIZE*sudokus), i++;){
        for (int j = 0; j < SIZE, j++;){
            printf("Numbers[%d][%d]:%d", i, j, sudoku[i][j]);
        }
    }*/
    system("pause");
    return 0;
}

int getUserInfo(){
    int sudokus;
    printf("How many Sudokus are you checking today?\n");
    scanf("%d{^\n]\n", &sudokus);

    return sudokus;
}

int** arrayMake(int sudokus){
    int **sudoku;
    int realsize;
    realsize = 9 * sudokus;

    sudoku = malloc(realsize*sizeof(int*));
    if (sudoku == NULL){
        printf("Memory allocation failed");
        return 0;
    }
    for (int i = 0; i < realsize, i++;){
        sudoku[i] = malloc(9 * sizeof(int));

        if (sudoku[i] == NULL){
            printf("Memory allocaiton failed");
            return 0;
                            }

    }

    return sudoku;
}

3 个答案:

答案 0 :(得分:3)

  

我的教授建议使用带有malloc调用的强制类型:sudoku =(int **)malloc(sudokus * sizeof(int *));但那对我不起作用。

要动态分配2D数组,通常需要执行两个步骤。您的代码不清楚,因为您包含的realsize = 9 * sudokus没有意义。无论如何,为简单起见,我们假设您的数独是一个3x3矩阵。你需要:

  1. 为指向int:

    的指针分配
    int **sudoku = malloc( 3 * sizeof( int * ) );
    
  2. 为每个指向int:

    的指针分配
    for( int i = 0; i < 3; i++ )
        sudoku[i] = malloc( 3 * sizeof( int ) );
    

答案 1 :(得分:2)

从我所看到的问题出现在你所拥有的for循环中:

for (i = 0;i < realsize , i++)

当你的意思是:

for (i = 0;i < realsize ; i++)                          ^ 请注意,;

的更改

答案 2 :(得分:0)

scanf("%d{^\n]\n", &sudokus);是个错误。

我猜你的意思是{实际上是[但格式字符串即使在更改后仍然是错误的。我认为您打算使用其余的输入,包括换行符。但是,您的格式字符串实际上并不这样做。

\n的扫描实际上意味着消耗任何数量的空白,所以实际上这段代码(带有[修复)将继续等待输入,直到有换行符,以及换行符后输入的另一个非空白字符。

更好的是:

scanf("%d", &sudokus);
int ch;
while ( (ch = getchar()) != '\n' && ch != EOF ) { }

有几种不同的方法可以实现相同的目标。 (请注意,扫描%d[^\n]%c不是其中之一;该字符串也会被破坏。)

另外,我建议使用与sudokus不同的变量名称。令人困惑的是有两个同名的变量sudokusudokus。将其命名为反映其含义的东西。

为了分配你的数组,取出arrayMake函数并编写如下内容会简单得多:

int sudoku[9][9];

(我无法弄清楚sudokus应该是什么意思或realsize将会是什么,但你可以把你想要的尺寸放在那里的方括号内。)