在C语言中动态分配2D数组
我一直在阅读,我一直在把我读到的东西应用到我的代码中,但我不确定我是否遗漏了什么。。假设2d数组镜像数独。 我知道问题区域在我的arrayMake函数中。 我的教授建议在malloc调用中使用cast,因此: 数独=int**mallocsudokus*sizeofint*;但这对我不起作用在C语言中动态分配2D数组,c,arrays,pointers,multidimensional-array,dynamic-memory-allocation,C,Arrays,Pointers,Multidimensional Array,Dynamic Memory Allocation,我一直在阅读,我一直在把我读到的东西应用到我的代码中,但我不确定我是否遗漏了什么。。假设2d数组镜像数独。 我知道问题区域在我的arrayMake函数中。 我的教授建议在malloc调用中使用cast,因此: 数独=int**mallocsudokus*sizeofint*;但这对我不起作用 int main(){ int sudokus; int** sudoku; sudokus = getUserInfo(); sudoku = arrayMake(sudo
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;
}
我的教授建议对malloc调用使用cast,所以:sudoku=int**mallocsudokus*sizeofint*;但这对我不起作用
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;
}
要动态分配2D数组,通常需要执行两个步骤。您的代码不清楚,因为您包含了一个realsize=9*数独,这是没有意义的。无论如何,为了简单起见,让我们假设你的数独是一个3x3矩阵。您需要:
为指向int的指针分配:
int **sudoku = malloc( 3 * sizeof( int * ) );
for( int i = 0; i < 3; i++ )
sudoku[i] = malloc( 3 * sizeof( int ) );
为每个指向int的指针分配:
int **sudoku = malloc( 3 * sizeof( int * ) );
for( int i = 0; i < 3; i++ )
sudoku[i] = malloc( 3 * sizeof( int ) );
我的教授建议对malloc调用使用cast,所以:sudoku=int**mallocsudokus*sizeofint*;但这对我不起作用
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;
}
要动态分配2D数组,通常需要执行两个步骤。您的代码不清楚,因为您包含了一个realsize=9*数独,这是没有意义的。无论如何,为了简单起见,让我们假设你的数独是一个3x3矩阵。您需要:
为指向int的指针分配:
int **sudoku = malloc( 3 * sizeof( int * ) );
for( int i = 0; i < 3; i++ )
sudoku[i] = malloc( 3 * sizeof( int ) );
为每个指向int的指针分配:
int **sudoku = malloc( 3 * sizeof( int * ) );
for( int i = 0; i < 3; i++ )
sudoku[i] = malloc( 3 * sizeof( int ) );
从我看到的情况来看,您的问题存在于for循环中,其中您有: 对于i=0;我是真实尺寸,我是++ 当你真正的意思是: 对于i=0;i
scanf("%d", &sudokus);
int ch;
while ( (ch = getchar()) != '\n' && ch != EOF ) { }
有几种不同的方法可以实现相同的目标。请注意,扫描%d[^\n]%c不是其中之一;该字符串也已断开
我还建议使用不同于数独的变量名。有两个名称相似的变量数独和数独会让人感到困惑。请给它取一个能反映其含义的名称
为了分配数组,取出arrayMake函数并编写如下内容会简单得多:
int sudoku[9][9];
我不知道数独的意思是什么,或者realsize是什么,但是你可以把你想要的尺寸放在方括号里。scanf%d{^\n]\n,&sudokus;是个错误
我猜您的意思是{实际上是一个[但是格式字符串在更改之后仍然是错误的。我认为您打算使用其余的输入,直到并包括一个换行符。但是,您的格式字符串实际上并没有这样做
Scanf'ing for \n实际上意味着使用任意数量的空格,因此实际上带有[fix]的代码将继续等待输入,直到有换行符,以及在换行符之后键入的另一个非空格字符
最好是:
scanf("%d", &sudokus);
int ch;
while ( (ch = getchar()) != '\n' && ch != EOF ) { }
有几种不同的方法可以实现相同的目标。请注意,扫描%d[^\n]%c不是其中之一;该字符串也已断开
我还建议使用不同于数独的变量名。有两个名称相似的变量数独和数独会让人感到困惑。请给它取一个能反映其含义的名称
为了分配数组,取出arrayMake函数并编写如下内容会简单得多:
int sudoku[9][9];
我不知道数独应该是什么意思,或者realsize应该是什么,但是你可以把你想要的维度放在方括号里。你想分配一个指针数组还是一个整数数组?要分配一个整数数组,只需分配行数乘以列数乘以sizeofint.Y即可你不需要为每一行或每一列进行新的分配。你的realsize是什么?你的意思是它总是像realsize=9*sudokus;?那么到底出了什么问题?你所有的for循环都是螺旋式的。对于int i=0;i