ядро сбрасывается при использовании fscanf - PullRequest
0 голосов
/ 05 ноября 2018

Я пытался прочитать текстовый файл с помощью функции fscanf, но каждый раз, когда я получаю «дамп памяти». Это странно, потому что когда я использую другой файл, который уже использую где-то еще, код тоже не работает, и я не обнаружил синтаксических ошибок.

мой код функции:

 inst_def_t* lect_dico_int(char* nomFichierDico, int* p_nb_inst) {
  /*Charge le ficheier dictionnaire nomFichierDico*/
  /*Retourne un pointeur sur le tableau dictionnaire*/
  /*Stocke le nb d'instructions dans *p_nb_inst*/

int i;
char s1[512];
inst_def_t *tab;
FILE* f1=open(nomFichierDico,"r");
printf("step 1 \n");
if(f1==NULL)
      return NULL;
    }
printf("step 2 \n");
fscanf(f1,"%d", p_nb_inst);
printf("step 3 \n");
  fclose(f1);
  return tab; /* here i just want to have my fscaf working not really matter of tab value */
}

мой основной код:

int main()
{ 
  int NbDefInstructions = 0 ;
  inst_def_t* = lect_dico_int("tests/DICO_INSTRUCTION.txt",&NbDefInstructions);
return EXIT_SUCCESS;
}

структура:

typedef struct {char * symbole; char type; int nb_op ;} inst_def_t;

и вот мой .txt:

4
ADD R 3
ADDI I 2
MULT R 2
DIV R 2

Когда я использую свой код, я перехожу к "шагу 2", но когда он прибывает в функцию fscanf Я получаю ошибку сегментации (ядро сброшено). Я просто хочу знать, где моя ошибка, которая мешает мне использовать функцию fscanf.

1 Ответ

0 голосов
/ 05 ноября 2018

Вы превышаете выделенный буфер памяти:

char* path2=strdup("tests/");
strcat(path,"DICO_INSTRUCTION.txt");

Функция strdup выделяет достаточно места для данной строки. Когда вы затем используете strcat для добавления к этой строке, вы пишете за пределами выделенной памяти. Это вызывает неопределенное поведение , которое в этом случае проявляется как дамп ядра.

Либо передайте полную строку в strdup:

char* path=strdup("tests/DICO_INSTRUCTION.txt");

Или, если вторая строка не является константой, или используйте asprintf, чтобы создать строку и выделить для нее место:

char *filename = "DICO_INSTRUCTION.txt";
char *path;
asprintf(&path, "tests/%s", filename);

Ваша другая проблема здесь:

FILE* f1=open(nomFichierDico,"r");

Вы звоните open, который возвращает числовой дескриптор файла вместо fopen, который возвращает указатель на FILE объект. Вы хотите:

FILE* f1=fopen(nomFichierDico,"r");
...