当我使用fscanf时核心转储

时间:2018-11-05 13:58:46

标签: c scanf

我试图读取具有功能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 :(得分:1)

您正在耗尽分配的内存缓冲区:

showHideBudget: function(contentObj, modelObj){ 
   _.each(contentObj.find('.budgetSec'), function(item){ 
       // ===> Unable to reference modelObj here <===

       budgetFlag = true;
       return;
    }, modelObj, this)
 })

char* path2=strdup("tests/"); strcat(path,"DICO_INSTRUCTION.txt"); 函数为给定的字符串分配足够的空间。然后,使用strdup附加到该字符串时,您正在写的内容已超出分配的内存范围。这样做会调用undefined behavior,在这种情况下,它会显示为核心转储。

将完整的字符串传递给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