如何防止malloc.c 3096 sYSMALLOC:assertion在使用fscanf从端口构建阵列时失败?

如何防止malloc.c 3096 sYSMALLOC:assertion在使用fscanf从端口构建阵列时失败?,c,malloc,scanf,calloc,C,Malloc,Scanf,Calloc,我正在编写一个从串行端口接收数据的解析程序,并且我一直得到一个malloc.c3096 sYSMALLOC断言在执行时失败。这是一段很长的代码,因此为了读者的简单性,我只包含了问题发生的部分。我可以确定问题是由于使用fscanf将值从端口写入mdpu_parse引起的,正如我之前使用scanf测试结构时使用的代码一样,将值写入数组,然后将其存储在结构中。 代码如下: #include <sdtio.h> #include <stdint.h>

我正在编写一个从串行端口接收数据的解析程序,并且我一直得到一个malloc.c3096 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;
                                 }
                           }

我知道我的某个地方有内存问题,但我看不出是什么导致了这个问题。非常感谢您的帮助

这定义了七个要素:

mpdu_parse = calloc(7, sizeof(char));
其中,当此循环八次时:

for(i=0 i<=7; i++)
访问数组mpdu_parse out of bounds for the elast迭代

要解决这个问题,你也可以这样做

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

mpdu_parse = calloc(8, sizeof(char));
for(i=0 i<7; i++)