我有这部分代码:
for(i = 0; i < matrix->y; i++)
{
printf("3.%i - %i %i\n", i, matrix->y, matrix->x);//write correct "3.0 - 3 4"
for(j = 0; j < matrix->x; j++)
{
printf("N - %i %i\n", matrix->y, matrix->x);//never write anything
fscanf(input, "%i", &grid[i][j]);
}
printf("3.%i - %i %i\n", i, matrix->y, matrix->x);//write wrong "3.0 - 3 0"
}
第一个printf输出y = 3和x = 4,但它永远不会进入循环内部,它永远不会到达for循环内的第二个printf。当我在for循环之后从第一行写入相同的printf时,它告诉我y = 3和x = 0。 我犯错的地方。
感谢。
修改
代码按原样写入。没有跳过任何行。
矩阵定义
typedef struct matrix
{
int x;
int y;
int ** grid;
} Matrix;
i和j由
定义int i, j;
整个功能
Matrix * loadMatrix(char * filename)
{
Matrix * matrix;
FILE * input;
input = fopen(filename, "r");
if (input == NULL)
printError (ERR_READFILE);
else
{
fscanf(input, "%i", &(matrix->y));
fscanf(input, "%i", &(matrix->x));
int i, j;
int grid[matrix->y][matrix->x];
matrix->grid = grid;
printf("2 - %i %i\n", matrix->y, matrix->x);
for(i = 0; i < matrix->y; i++)
{
printf("3.%i - %i %i\n", i, matrix->y, matrix->x);
for(j = 0; j < matrix->x; j++)
{
printf("N - %i %i\n", matrix->y, matrix->x);
fscanf(input, "%i", &grid[i][j]);
}
printf("3.%i - %i %i\n", i, matrix->y, matrix->x);
fclose(input);
}
return matrix;
}
答案 0 :(得分:3)
您的程序行为未定义,因为您没有为matrix
分配存储空间。所以任何事情都可能发生。
在您声明matrix
之后(在fscanf
行似乎最佳之前)将其添加到某处:
matrix = malloc(sizeof(Matrix));
并将您声明matrix
的行更改为:
Matrix *matrix = NULL;
(否则,如果fopen
失败,您将返回垃圾。)
第二个问题是,您当时也未能为matrix->grid
分配适当的存储空间。在函数返回后,您无法保持指向局部变量的指针。
您还需要使用malloc
或calloc
创建该存储空间。请参阅此问题:How do I work with dynamic mutli-dimensional arrays in C以获取如何执行此操作的示例。
完成使用后,您还需要注意free
这两个。
不要忘记#include <stdlib.h>
和malloc
所需的free
。
答案 1 :(得分:1)
我犯错误的地方?
您尚未通过matrix
指针分配空间进行访问。
答案 2 :(得分:1)
在您的代码中,您永远不会初始化matrix
,这意味着它可以指向任何内容。这可能导致访问冲突错误(如果你很幸运)或奇怪的错误(如果你不是)。要初始化它,请使用malloc
:
matrix = malloc(sizeof(Matrix));
使用Matrix
时,不要忘记在不再需要free
时取消分配内存。
您还应检查malloc
是否未返回NULL
,这可能会在可用内存不足时发生。