如何防止malloc.c 3096 sYSMALLOC:使用fscanf从端口构建数组时断言失败?

时间:2014-06-30 15:14:23

标签: c malloc scanf calloc

我正在编写一个从串口接收数据的解析程序,并且在执行时我不断收到“malloc.c 3096 sYSMALLOC断言失败”。这是一个非常长的代码,因此为了简化读者,我只包括发生问题的部分。我可以确定问题出现在某处,因为使用fscanf将端口值写入mdpu_parse,因为当我只是使用scanf测试结构来将值写入数组然后将它们存储在结构中时,代码以前工作。 这是代码:

       #include <sdtio.h>
       #include <stdint.h>
       #include <stdlib.h>
       #include "mpdu_init.h"
       #define  BAUDRATE B115200
       #define  PORT "/dev/ttyS0"
       main(){

       char *mpdu_parse;
       char  npdu_parse[100];
       char  apdu_parse[500];
       FILE *fp;
       MPDU *mpdu = malloc(sizeof(mpdu));
       *mpdu = init_mpdu();

        mpdu_parse = calloc(7, sizeof(char));

       fp = fopen(PORT, "r+");
       check1: for(i=0 i< 7; i++){
                 fscanf(fp, "%02x", &mpdu_parse[i]);
                 }

           fclose(fp);


      if((mpdu_parse[0] == 0x55) && (mpdu_parse[1] == 0xFF)){

                    mpdu -> frame_type = mpdu_parse[2];
                    mpdu -> dest_addr = mpdu_parse[3];
                    mpdu -> source_addr = mpdu_parse[4];
                    mpdu -> length[0] = mpdu_parse[5];
                    mdpu -> length[1] = mpdu_parse[6];
                    mpdu -> data_crc = mpdu_parse[7];
                goto check1;
                }
                else if((mdpu_parse[0] != 0x55) || (mpdu_parse[1] != 0xFF)){
                                print("invalid message\n");
                                      goto check1;
                                 }
                           }

我知道我在某个地方有内存问题,但我看不出是什么导致了这个问题。任何帮助是极大的赞赏。

1 个答案:

答案 0 :(得分:0)

这定义了七个要素:

mpdu_parse = calloc(7, sizeof(char));

这里循环八次:

for(i=0 i<=7; i++)

所以这个

fscanf(fp, "%02x", &mpdu_parse[i]);

访问数组mpdu_parse超出弹性迭代范围。

要解决此问题,请执行

mpdu_parse = calloc(8, sizeof(char));

for(i=0 i<7; i++)