2013-08-14 4 views
0

Мой код опубликован ниже, я уверен, что ошибка сегментации происходит в цикле while в нижней части main().Ошибка сегментации (сбрасывание ядра) c

Моя программа должна прочитать файл, данные в форме сетки, fscanf получает размеры сетки, а затем создает 2D-массив с этими размерами, затем я использую цикл while для прохождения строки за строкой а затем цикл for, чтобы пройти через символ по символу в этой строке, чтобы сохранить его во внутренней части массива, тогда i ++ отправляет его на следующий уровень 2D-массива.

может ли кто-нибудь сказать мне, почему это делается?

#include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 

    char direction; 
    int steps; 
    int cur[2]; 
    char** gridArray; 
    int* move(int cur[2]); 
    int* getCommand(int next[2], char** gridArray); 
    char** make2DFileArray(int sizeX, int sizeY); 
    int* makeArray(int size); 

    int main(int argc, char *argv[]) 
    { 
      FILE *fp; 
      int rows; 
      int columns; 
      int i=0,j; 
      char line[1000]; 

      if ((argc < 2)^(argc > 3)) { 
        fprintf(stderr, "Usage: thebox mapfile [maxsteps]\n"); 
        exit(1); 
      } 
      if(argc < 3) { steps = 10; } 
      else { steps = argv[2]; } 

      fp = fopen(argv[1], "r"); 
      if(fp == NULL) { 
        fprintf(stderr, "Missing map file.\n"); 
        exit(1); 
      } 

      fscanf(fp, "%d %d", &rows, &columns); 
      gridArray = make2DFileArray(rows+1, columns); 

      while (fgets(line, 1000, fp) != NULL) { 
       for(j=0; j < columns - 1; j++) { 
         gridArray[i][j] = line [j]; 
       } 
       i++; 
       printf("%s", line); 
     } 
     fclose(fp); 
     printf("(sidepos)>\n"); 
     return 0; 
} 

и мой вспомогательный метод, это

char** make2DFileArray(int sizeX, int sizeY) 
{ 
     int i; 
     char** array; 
     array = (char**) malloc(sizeX*sizeof(char*)); 

     for (i = 0; i < sizeX; i++) { 
       array[i] = (char*) malloc(sizeY*sizeof(char)); 
       return array; 
     } 
     return array; 
} 

int* makeArray(int size) 
{ 
     int* array; 
     array = (int*) malloc(size*sizeof(int)); 
     return array; 
} 
+2

ли вы на самом деле имели в виду, чтобы написать это ', если ((ARGC < 2)^(argc > 3))'? – cnicutar

+0

Каков внутренний 'возвращаемый массив,' для 'make2DFileArray()'? Это опечатка? – alk

+2

Хорошим началом было бы запустить вашу программу в отладчике. После этого отладчик остановится, когда и где произойдет сбой. Затем вы можете проверить стек вызовов функций и подойти к нему, если авария не произойдет в вашем собственном коде. Отладчик также позволит вам изучить значения переменных, которые помогут вам понять, почему произошел сбой. –

ответ

4

Ошибка в функции make2DFileArray. Вы просто возвращаетесь после первого выделения в цикле, то есть выделяется только gridArray[0].

Поскольку ни одна из других записей не будет выделена, доступ, например, gridArray[1] - это неопределенное поведение и причина вашего сбоя.

+0

, так что я должен просто удалить первый возвращаемый массив? –

+0

@AaronTroeger Да, вы должны, один * внутри * цикл не должен быть там. –

+1

Да, его работа! спасибо вам столько :) Я всегда пропустил эти глупые небольшие ошибки –

2

Это:

for (i = 0; i < sizeX; i++) { 
    array[i] = (char*) malloc(sizeY*sizeof(char)); 
    return array; 
} 

return array; 

... должно быть:

for (i = 0; i < sizeX; i++) { 
    array[i] = (char*) malloc(sizeY*sizeof(char)); 
} 

return array; 

... в функции make2DFileArray.

Примечание: Элемент выделяется памятью, однако остальные элементы не из-за вашего return внутри цикла. Каждый элемент в массиве из [1 ... length - 1] является случайным адресом памяти (потому что когда вы malloc вы не заполнили их как правильные указатели) и, следовательно, разыменовывая любой элемент, отличный от того, который находится в позиции 0, приведет к неопределенному поведению , Тип

1
steps = argv[2]; 

'ступенек' переменной int, и переменная 'ARGV [2]' типа char *, не может быть непосредственно назначен.

Вы можете сделать это с помощью

steps = atoi(argv[2]); 
+0

В этом случае 'atoi()' является unsave, так как он возвращает '0' в случае невозможности конвертировать свой аргумент (здесь:' arg [ 2] ') в' int'. Безопасный подход использует 'strtol()' для преобразования «строки» в целое число. – alk

Смежные вопросы