For-loop - 结构

时间:2011-10-04 15:24:33

标签: c

我有这部分代码:

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;
}

3 个答案:

答案 0 :(得分:3)

您的程序行为未定义,因为您没有为matrix分配存储空间。所以任何事情都可能发生。

在您声明matrix之后(在fscanf行似乎最佳之前)将其添加到某处:

matrix = malloc(sizeof(Matrix));

并将您声明matrix的行更改为:

Matrix *matrix = NULL;

(否则,如果fopen失败,您将返回垃圾。)

第二个问题是,您当时也未能为matrix->grid分配适当的存储空间。在函数返回后,您无法保持指向局部变量的指针。

您还需要使用malloccalloc创建该存储空间。请参阅此问题: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,这可能会在可用内存不足时发生。