отказ seg вызывается malloc и sscanf в функции

Я хочу открыть текстовый файл (см. ниже), считайте первый интервал в каждой строке и сохраните его в массиве, но я получаю отказ сегментации. Я избавился от всех gcc предупреждений, я прочитал несколько учебных руководств, которые я нашел в сети и искал stackoverflow решения, но я, которого разбирают could't, что я делаю неправильно.

Это работает, когда у меня есть все в основной функции (см. пример 1), но не, когда я передаю его второй функции (см. пример 2 далее вниз). В примере 2 я добираюсь, когда я интерпретирую gdb правильно отказ seg в sscanf (line,"%i",classes[i]);.

Я боюсь, это могло быть что-то тривиальное, но я уже пропал впустую однажды на нем.

Заранее спасибо.

[Пример 1] Даже при том, что это работает со всем в основном:

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

const int LENGTH = 1024;

int main() {
  char *filename="somedatafile.txt";
  int *classes;
  int lines;      
  FILE *pfile = NULL; 
  char line[LENGTH];
  pfile=fopen(filename,"r");
  int numlines=0;
  char *p;

  while(fgets(line,LENGTH,pfile)){
    numlines++;
  }

  rewind(pfile);

  classes=(int *)malloc(numlines*sizeof(int));
  if(classes == NULL){
    printf("\nMemory error.");
    exit(1);
  }
  int i=0;
  while(fgets(line,LENGTH,pfile)){
    printf("\n");
    p = strtok (line," ");
    p = strtok (NULL, ", ");
    sscanf (line,"%i",&classes[i]);
    i++;
  }
  fclose(pfile);
  return 1;
}

[Пример 2] Это не делает с функциональностью, переданной функции:

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

const int LENGTH = 1024;

void read_data(int **classes,int *lines, char *filename){
  FILE *pfile = NULL; 
  char line[LENGTH];
  pfile=fopen(filename,"r");
  int numlines=0;
  char *p;

  while(fgets(line,LENGTH,pfile)){
    numlines++;
  }

  rewind(pfile);

  * classes=(int *)malloc(numlines*sizeof(int));
  if(*classes == NULL){
    printf("\nMemory error.");
    exit(1);
  }
  int i=0;
  while(fgets(line,LENGTH,pfile)){
    printf("\n");
    p = strtok (line," ");
    p = strtok (NULL, ", ");
    sscanf (line,"%i",classes[i]);
    i++;
  }
  fclose(pfile);
  *lines=numlines;
}  

int main() {
  char *filename="somedatafile.txt";
  int *classes;
  int lines;

  read_data(&classes, &lines,filename) ;
  for(int i=0;i<lines;i++){
    printf("\nclasses[i]=%i",classes[i]);
  }
  return 1;
}

[Содержание somedatafile.txt]

50 21 77 0 28 0 27 48 22 2
55 0 92 0 0 26 36 92 56 4
53 0 82 0 52 -5 29 30 2 1
37 0 76 0 28 18 40 48 8 1
37 0 79 0 34 -26 43 46 2 1
85 0 88 -4 6 1 3 83 80 5
56 0 81 0 -4 11 25 86 62 4
55 -1 95 -3 54 -4 40 41 2 1
53 8 77 0 28 0 23 48 24 4
37 0 101 -7 28 0 64 73 8 1
...
1
задан Framester 26 May 2010 в 16:13
поделиться

2 ответа

Это:

 sscanf (line,"%i",classes[i]);

вероятно, неправильно. Там тоже нужно разыменовать, попробуйте:

 sscanf (line,"%i", &(*classes)[i]);

Это потому, что classes - это указатель на массив целых чисел. Вам нужен адрес одного из этих целых чисел, чтобы sscanf() мог записать туда разобранное число. Поэтому сначала нужно разыменовать classes, чтобы получить массив, а затем сказать, что вам нужен адрес элемента номер i в этом массиве.

Вы также можете использовать

 sscanf (line,"%i", *classes + i);

Что может быть более понятным, в зависимости от того, насколько вы хорошо разбираетесь в этих вещах.

2
ответ дан 3 September 2019 в 00:17
поделиться

Проблема в том, что вы применяете оператор [] к int* в первом случае и к int** во втором. int** - это как двухмерный массив, и когда вы используете оператор [] в сочетании с int**, вы индексируете массив int*. В вашем случае это не то, что вы хотите, потому что вы инициализируете только первую запись в этом массиве. Поэтому, когда вы обратитесь к classes[1], произойдет сбой, потому что он неинициализирован. Вы могли бы избежать этой путаницы, передав указатель в виде ссылки вместо двойного указателя:

int*& classes instead of int** classes

Тогда вы могли бы использовать тот же код, что и в вашей основной функции.

0
ответ дан 3 September 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: