在 C 中动态分配二维数组
Dynamically allocating a 2D array in C
我一直在阅读,我一直在将我一直在阅读的内容应用到我的代码中,但我不确定我是否遗漏了什么.. 二维数组应该是数独的镜像。
我知道问题区域在我的 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;
}
My professor recommended using a cast with the malloc call so: sudoku = (int**)malloc(sudokus * sizeof(int*)); but that did not work for me.
动态分配二维数组,通常需要做两步。您的代码不清楚,因为您包含一个没有意义的 realsize = 9 * sudokus
。无论如何,为简单起见,我们假设您的数独是一个 3x3 矩阵。您需要:
分配指向 int 的指针:
int **sudoku = malloc( 3 * sizeof( int * ) );
为每个指向 int 的单独指针分配:
for( int i = 0; i < 3; i++ )
sudoku[i] = malloc( 3 * sizeof( int ) );
据我所知,您的 for
循环存在问题:
for (i = 0;i < realsize , i++)
当你真正的意思是:
for (i = 0;i < realsize ; i++)
^
注意 ,
到 ;
的变化
scanf("%d{^\n]\n", &sudokus);
是一个错误。
我猜你的意思是 {
实际上是一个 [
但即使在更改之后格式字符串仍然是错误的。我认为您打算使用剩余的输入,包括换行符。但是,您的格式字符串实际上并没有这样做。
扫描 \n
实际上意味着 消耗任意数量的空白 ,因此实际上此代码(使用 [
修复)将继续等待用于输入,直到出现换行符,以及在换行符之后键入的另一个 non-whitespace 字符。
更好的是:
scanf("%d", &sudokus);
int ch;
while ( (ch = getchar()) != '\n' && ch != EOF ) { }
有几种不同的方法可以实现相同的目标。 (请注意,扫描 %d[^\n]%c
不是其中之一;该字符串也已损坏)。
此外,我建议使用与 sudokus
不同的变量名称。有两个 similarly-named 变量 sudoku
和 sudokus
令人困惑。将其命名为反映其含义的名称。
为了分配数组,取出 arrayMake
函数并编写如下内容会简单得多:
int sudoku[9][9];
(我不知道 sudokus
应该是什么意思,或者 realsize
会是什么意思,但是你可以把你想要的尺寸放在方括号里)。
我一直在阅读,我一直在将我一直在阅读的内容应用到我的代码中,但我不确定我是否遗漏了什么.. 二维数组应该是数独的镜像。
我知道问题区域在我的 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;
}
My professor recommended using a cast with the malloc call so: sudoku = (int**)malloc(sudokus * sizeof(int*)); but that did not work for me.
动态分配二维数组,通常需要做两步。您的代码不清楚,因为您包含一个没有意义的 realsize = 9 * sudokus
。无论如何,为简单起见,我们假设您的数独是一个 3x3 矩阵。您需要:
分配指向 int 的指针:
int **sudoku = malloc( 3 * sizeof( int * ) );
为每个指向 int 的单独指针分配:
for( int i = 0; i < 3; i++ ) sudoku[i] = malloc( 3 * sizeof( int ) );
据我所知,您的 for
循环存在问题:
for (i = 0;i < realsize , i++)
当你真正的意思是:
for (i = 0;i < realsize ; i++)
^
注意 ,
到 ;
scanf("%d{^\n]\n", &sudokus);
是一个错误。
我猜你的意思是 {
实际上是一个 [
但即使在更改之后格式字符串仍然是错误的。我认为您打算使用剩余的输入,包括换行符。但是,您的格式字符串实际上并没有这样做。
扫描 \n
实际上意味着 消耗任意数量的空白 ,因此实际上此代码(使用 [
修复)将继续等待用于输入,直到出现换行符,以及在换行符之后键入的另一个 non-whitespace 字符。
更好的是:
scanf("%d", &sudokus);
int ch;
while ( (ch = getchar()) != '\n' && ch != EOF ) { }
有几种不同的方法可以实现相同的目标。 (请注意,扫描 %d[^\n]%c
不是其中之一;该字符串也已损坏)。
此外,我建议使用与 sudokus
不同的变量名称。有两个 similarly-named 变量 sudoku
和 sudokus
令人困惑。将其命名为反映其含义的名称。
为了分配数组,取出 arrayMake
函数并编写如下内容会简单得多:
int sudoku[9][9];
(我不知道 sudokus
应该是什么意思,或者 realsize
会是什么意思,但是你可以把你想要的尺寸放在方括号里)。