我是学生,我不得不承认我的指针有点弱,这就是我练习这个练习的原因。目前我的问题是我的程序在遇到printf时在markMines()函数中崩溃。我相信它,因为它读取了null。我几乎尝试过各种各样的方式。我已经检查了问题从哪里开始,以及它何时开始* field = array;我已经在这几个小时了,我需要一双新眼睛来帮助我。另请注意,所有函数参数和main()都已设置,我无法更改它们。我在下面添加了我的代码。
int main(void)
{
int **mine=0;
int r,c;
initField(&mine,&r,&c);
markMines(mine,r,c);
return 0;
}
void initField(int ***field, int *rows, int *cols)
{
int r, c;
int FieldInput = 0;
int **array;
scanf("%d %d", &r, &c );
array = malloc((r)*sizeof(int));
*rows = r;
*cols = c;
for(r = 0; r < *rows; r++)
{
array[r] = malloc((c)*sizeof(int));
}
field =&array;
for(r = 0; r < *rows; r++)
{
for(c = 0; c < *cols; c++)
{
scanf("%d", &FieldInput);
array[r][c] = FieldInput;
}
printf("\n");
}
}
void markMines(int *const*const field, int rows, int cols)
{
int r = 0, c = 0;
for(r = 0; r <rows ; r++)
{
for(c = 0; c < cols ; c++)
{
printf("%d ", **field );
}
}
}
我很感激任何帮助。
答案 0 :(得分:0)
array = malloc((r)*sizeof(int));
错误,因为元素为int*
,而不是int
。field =&array;
错误,因为它修改了参数field
,而不是mine
中的变量main()
。printf("%d ", **field );
可能是错误的,因为它为所有迭代打印相同的元素。试试这个:
#include <stdio.h>
#include <stdlib.h>
void initField(int ***field, int *rows, int *cols)
{
int r, c;
int FieldInput = 0;
int **array;
scanf("%d %d", &r, &c );
array = malloc((r)*sizeof(int*));
*rows = r;
*cols = c;
for(r = 0; r < *rows; r++)
{
array[r] = malloc((c)*sizeof(int));
}
*field = array;
for(r = 0; r < *rows; r++)
{
for(c = 0; c < *cols; c++)
{
scanf("%d", &FieldInput);
array[r][c] = FieldInput;
}
printf("\n");
}
}
void markMines(int *const*const field, int rows, int cols)
{
int r = 0, c = 0;
for(r = 0; r <rows ; r++)
{
for(c = 0; c < cols ; c++)
{
printf("%d ", *(*(field + r) + c) );
}
}
}
int main(void)
{
int **mine = 0;
int r, c;
initField(&mine, &r, &c);
markMines(mine, r, c);
for(r--; r >= 0; r--)
{
free(mine[r]);
}
free(mine);
return 0;
}
答案 1 :(得分:0)
这些功能完全无效。
程序可以通过以下方式定义。考虑到函数应该在main中使用之前声明。
#include <stdlib.h>
#include <stdio.h>
void initField(int ***field, int *rows, int *cols);
void markMines( int *const*const field, int rows, int cols);
int main( void )
{
int **mine = 0;
int r, c;
int i;
initField(&mine,&r,&c);
markMines( mine, r, c );
for ( i = 0; i < r; i++ ) free( mine[i] );
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
free( mine );
//^^^^^^^^^^^
}
void initField(int ***field, int *rows, int *cols)
{
int r, c;
int FieldInput = 0;
int **array;
scanf("%d %d", rows, cols );
array = malloc( *rows * sizeof( int *) );
// ^^^^^^
for ( r = 0; r < *rows; r++)
{
array[r] = malloc( *cols *sizeof( int ) );
}
*field = array;
//^^^^^^^^^^^^^
for ( r = 0; r < *rows; r++ )
{
for ( c = 0; c < *cols; c++ )
{
scanf("%d", &FieldInput);
array[r][c] = FieldInput;
}
printf("\n");
}
}
void markMines( int *const*const field, int rows, int cols)
{
int r = 0, c = 0;
for(r = 0; r <rows ; r++)
{
for(c = 0; c < cols ; c++)
{
printf( "%d ", *( *( field + r ) + c ) );
// ^^^^^^^^^^^^^^^^^^^^^^^
}
printf( "\n" );
}
}
答案 2 :(得分:0)
您将错误的尺寸传递给malloc
以分配array
。您需要分配一个指针数组,而不是int
数组。使用:
array = malloc((r)*sizeof(int *));
或:
array = malloc((r)*sizeof(*array));
或:
array = calloc(r, sizeof(int *));
或:
array = calloc(r, sizeof(*array));