2015-03-31 3 views
0

Я читаю из файла (каждая строка содержит 1 слово) и помещает каждую строку в массив. Однако я получаю ошибку сегментации всякий раз, когда пытаюсь получить доступ к любому элементу массива. Любая помощь по этому поводу очень ценится. * обновление: добавлен время цикла, чтобы захватить персонажа один за другим, но я все еще получаю ошибку сегментацииОшибка доступа к данным из массива

Указатель был сделан здесь:

char* ptr; 

Я передал его через функцию, как это:

fillDict(ptr,&size); 
int fillDict(char* ptr,int *size) 

и он читает файл и помещает его в массив здесь:

int i = -1; 
    int numb; 
    int wsize; 
    while (fgets(word,30,file)!=NULL) 
    { 
      if (i==-1) 
      { 
        if(word[strlen(word)-1]=='\n') 
        { 
          word[strlen(word)-1] = 0; 
        } 
        numb = atoi(word); 
        ptr = malloc(sizeof(char)); 
      } 
      else 
      { 
        if(word[strlen(word)-1]=='\n') 
        { 
          word[strlen(word)-1] = 0; 
        } 
        wsize = wsize+strlen(word); 
        ptr = realloc(ptr,wsize); 

        int j = 0;      //added from here 
        while(j<strlen(word)-1) 
        { 
          printf("%d\n",j); 
          ptr[j] = word[j];  //crashes here 
          j++; 
        } 
        ptr[j] = '\0';     //to here 

        size++; 
      } 
      i++; 
    } 
    printf("%s",ptr[0]);   //but fails here 
    fclose(file); 
+3

'ptr [i] = word;' вы создаете 1 мерный массив и пытаетесь рассматривать его как 2-мерный. – Jagannath

+0

Да, и похоже, что память, которую указывает слово 'word', уже недействительна, поскольку она выходит за рамки вне цикла while. – texasflood

ответ

0

Как упоминалось в @Jagannath, вы обрабатываете переменную ptr как 2-мерный массив.

В действительности вы выделяете его как простой буфер.

Схематично:

ptr = [][][][][][][][][][][][][][\0]; 

Тогда у вас есть word, который также является простой буфер следующим образом:

word = [h][e][l][l][o][\0]; 

Если вы хотите скопировать word в ptr, вам нужно перебрать и буферов и скопировать символ по типу:

word = [h][e][l][l][o][\0]; 
     v v v v v 
ptr = [h][e][l][l][o][][][][][][][][][\0]; 

В противном случае вы можете создать массив из word, создав 2-мерный массив.

ptr = [|][|][][]...[\0] 
     v v 
     [h][w] 
     [e][o] 
     [l][r] 
     [l][l] 
     [o][d] 
     [0][0] 

И, наконец, у вас есть недостатки в коде. Посмотрите на свой malloc(1) ... И ваш wsize никогда не инициализируется, поэтому, когда вы делаете wsize = wsize+strlen(word);, поведение не определено.

0

Этот код показывает некоторое фундаментальное непонимание того, как работают указатели. ptr[i] эквивалентен *(ptr+i). Это не имеет смысла в контексте вашего кода. Поэтому он должен быть символом, но вы назначаете ему указатель на символ. И printf, который терпит неудачу, ну, конечно, это провалится. он ожидает указатель на символ, но вместо этого он получает любые данные в местоположении. ptr указывает на это и указывает на это как указатель. Вероятно, это будет запрещенная ячейка памяти, следовательно, segfault. Даже если это не так, вряд ли он достигнет нулевого завершающего байта, прежде чем он выйдет из строя.

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