visual studio访问冲突读取位置0xc0000005 我在QC++中使用Qt库接收TCP中的数据。我将接收到的数据包存储在一个QByteArray中,但是在读取了整个数据之后,我在调试中遇到了这个错误。最后,我尝试清除缓冲区,但在尝试清除缓冲区的同时,我也遇到了这个问题

visual studio访问冲突读取位置0xc0000005 我在QC++中使用Qt库接收TCP中的数据。我将接收到的数据包存储在一个QByteArray中,但是在读取了整个数据之后,我在调试中遇到了这个错误。最后,我尝试清除缓冲区,但在尝试清除缓冲区的同时,我也遇到了这个问题,c++,visual-studio,C++,Visual Studio,这是我的密码: void AvaNPortTester::scoket_readyRead() { ui.lineEdit_Sending_Status_->setText("Sent"); ui.lineEdit_Sending_Status_->setStyleSheet("QLineEdit { background: rgb(50, 255, 50); }"); tcpSocket_data_buffer_.append(tcpSocket_->

这是我的密码:

void AvaNPortTester::scoket_readyRead()
{
    ui.lineEdit_Sending_Status_->setText("Sent");
    ui.lineEdit_Sending_Status_->setStyleSheet("QLineEdit { background: rgb(50, 255, 50);  }");
    tcpSocket_data_buffer_.append(tcpSocket_->readAll());

    //qDebug() << serialport_data_buffer_.size();
    //auto ddd = QString::number(tcpSocket_data_buffer_.size());// +" : " + tcpSocket_data_buffer_.toHex();
    //ui.lableSocketRead->setText(ddd);
    bool read_aain = false;
    QByteArray dummy(int(1446), Qt::Initialization::Uninitialized);
    int reminded_data = 0;
    int dummy_size = 0;
    int frame_size = 0;
    int l_size = 0;     

    int total_size_rcvd = tcpSocket_data_buffer_.size();
    //int total_size_rcvd_b = total_size_rcvd_b;
    int temp = 0;
    while (total_size_rcvd != 0)
    {
        if(total_size_rcvd != 0){
        auto packet = tcpSocket_data_buffer_.mid(0, 1446);
        auto rem = tcpSocket_data_buffer_.mid(1446);//****1146

        tcpSocket_data_buffer_ = rem;

        QDataStream streamdata(packet);


        uint8_t  Sync_Header[3];
        auto ss = streamdata.readRawData((char*)&Sync_Header, 3);

        uint8_t  Total_size[2];
        ss = streamdata.readRawData((char*)&Total_size, 2);
        int t_size = Total_size[0] * 256 + Total_size[1];


        uint8_t  Reserved[2];
        ss = streamdata.readRawData((char*)&Reserved, 2);

        frame_size = t_size - 2;
        reminded_data = t_size - 2;
        while (frame_size != 0)
        {

            uint8_t  portid;
            ss = streamdata.readRawData((char*)&portid, 1);

            //ui.lineEdit_FileSize->setText(QString::number(fileSend_2Ser->size()));

            uint8_t  ProtocolID;
            ss = streamdata.readRawData((char*)&ProtocolID, 1);

            uint8_t  MoreFragmentFlag;
            ss = streamdata.readRawData((char*)&MoreFragmentFlag, 1);

            uint8_t  Seq;
            ss = streamdata.readRawData((char*)&Seq, 1);

            uint8_t  size[2];
            ss = streamdata.readRawData((char*)&size, 2);
            l_size = size[0] * 256 + size[1];

            if (packet_flags.Ser2Eth.packet_started[portid] == false) {
                uint8_t  DDCMP_Header[14];
                ss = streamdata.readRawData((char*)&DDCMP_Header, 14);
                packet_flags.Ser2Eth.protocol_payload_size[portid] = DDCMP_Header[7] + 256 * DDCMP_Header[8];
                temp = packet_flags.Ser2Eth.protocol_payload_size[portid];
                packet_flags.Ser2Eth.packet_started[portid] = true;
            }
            QByteArray ddcmp_datap(int(l_size), Qt::Initialization::Uninitialized);
            streamdata.readRawData(ddcmp_datap.data(), l_size - 14);
            if ((pre_more_frag == 0) && (MoreFragmentFlag == 0)) {
                packet_flags.Ser2Eth.packet_ended[portid] = true;
                packet_flags.Ser2Eth.protocol_payload_size[portid] = l_size;
                temp = packet_flags.Ser2Eth.protocol_payload_size[portid];
            }
            else if ((pre_more_frag == 0) && (MoreFragmentFlag == 1)) {
                packet_flags.Ser2Eth.packet_ended[portid] = false;
                packet_flags.Ser2Eth.protocol_payload_size[portid] = l_size + 16;
                temp = packet_flags.Ser2Eth.protocol_payload_size[portid];
            }
            else if ((pre_more_frag == 1) && (MoreFragmentFlag == 1)) {
                packet_flags.Ser2Eth.packet_ended[portid] = false;
                packet_flags.Ser2Eth.protocol_payload_size[portid] = packet_flags.Ser2Eth.protocol_payload_size[portid] + l_size;
                temp = packet_flags.Ser2Eth.protocol_payload_size[portid];
            }
            else if ((pre_more_frag == 1) && (MoreFragmentFlag == 0)) {
                packet_flags.Ser2Eth.packet_ended[portid] = true;
                packet_flags.Ser2Eth.protocol_payload_size[portid] = packet_flags.Ser2Eth.protocol_payload_size[portid] + l_size;
                temp = packet_flags.Ser2Eth.protocol_payload_size[portid];
            }


            if (MoreFragmentFlag == 1) {
                pre_more_frag = 1;
            }
            else {
                pre_more_frag = 0;
            }
            int ff = 0;
            if (packet_flags.Ser2Eth.packet_ended[portid] == true) {
                packet_flags.Ser2Eth.packet_started[portid] = false;
                packet_flags.Ser2Eth.packet_started[portid] = false;
                set_port_id_flag(portid, packet_flags.Ser2Eth.protocol_payload_size[portid], ProtocolID);
                pre_more_frag = 0;
            }

            reminded_data = reminded_data - 6 - l_size;
            //ui.lableSocketRead->setText(ddcmp_datap.toHex());

            frame_size = frame_size - l_size - 6;
        }//end of while (frame_size != 0)

        uint8_t sync_footer[3];
        streamdata.readRawData((char *)&sync_footer, 3);
        dummy_size = 1446 - t_size - 8;
        uint8_t dummy_data[1000];
        streamdata.readRawData((char *)&dummy_data, dummy_size);
        total_size_rcvd = total_size_rcvd - 1446;
        if (total_size_rcvd == 0) {
            tcpSocket_data_buffer_.clear();
        }

    } //end of if
    }//end of while()
}
void AvaNPortTester::scoket_readyRead()
{
ui.lineEdit_Sending_Status_uu->setText(“已发送”);
ui.lineEdit_Sending_Status_uu->setStyleSheet(“QLineEdit{background:rgb(50255,50);}”);
tcpSocket_data_buffer_.append(tcpSocket_->readAll());
//qDebug()setText(ddd);
bool read_aain=false;
QByteArray虚拟(int(1446),Qt::Initialization::Uninitialized);
int_data=0;
int dummy_size=0;
int frame_size=0;
int l_size=0;
int total_size_rcvd=tcpSocket_data_buffer_u.size();
//int total_size_rcvd_b=总尺寸_rcvd_b;
内部温度=0;
while(总尺寸=0)
{
如果(总尺寸\u rcvd!=0){
自动数据包=tcpSocket\u data\u buffer\u.mid(0,1446);
自动rem=tcpSocket_data_buffer_.mid(1446);/**1146
tcpSocket_数据_缓冲区=rem;
QDataStream streamdata(数据包);
uint8_t Sync_头[3];
auto ss=streamdata.readRawData((char*)和Sync_头,3);
uint8_t总尺寸[2];
ss=streamdata.readRawData((字符*)和总大小,2);
int t_size=总大小[0]*256+总大小[1];
uint8_t保留[2];
ss=streamdata.readRawData((char*)和Reserved,2);
框架尺寸=t尺寸-2;
提醒_数据=t_大小-2;
while(帧大小!=0)
{
uint8_t端口;
ss=streamdata.readRawData((char*)&portid,1);
//lineEdit_FileSize->setText(QString::number(fileSend_2Ser->size());
uint8_t原肠杆菌;
ss=streamdata.readRawData((char*)和ProtocolID,1);
uint8_t MoreFragmentFlag;
ss=streamdata.readRawData((char*)&MoreFragmentFlag,1);
uint8_t Seq;
ss=streamdata.readRawData((char*)和Seq,1);
uint8_t尺寸[2];
ss=streamdata.readRawData((char*)和size,2);
l_size=大小[0]*256+大小[1];
if(packet_flags.Ser2Eth.packet_start[portid]==false){
uint8_t DDCMP_头[14];
ss=streamdata.readRawData((char*)和DDCMP_头,14);
packet_flags.Ser2Eth.protocol_payload_size[portid]=DDCMP_头[7]+256*DDCMP_头[8];
temp=数据包标志。第二个协议有效负载大小[portid];
packet_flags.Ser2Eth.packet_start[portid]=true;
}
QByteArray ddcmp_数据(int(l_大小),Qt::Initialization::Uninitialized);
streamdata.readRawData(ddcmp_datap.data(),l_size-14);
if((pre_more_frag==0)和&(MoreFragmentFlag==0)){
packet_flags.Ser2Eth.packet_end[portid]=true;
packet_flags.Ser2Eth.protocol_payload_size[portid]=l_size;
temp=数据包标志。第二个协议有效负载大小[portid];
}
else if((pre_more_frag==0)和&(MoreFragmentFlag==1)){
packet_flags.Ser2Eth.packet_end[portid]=false;
packet_flags.Ser2Eth.protocol_payload_size[portid]=l_size+16;
temp=数据包标志。第二个协议有效负载大小[portid];
}
else if((pre_more_frag==1)和&(MoreFragmentFlag==1)){
packet_flags.Ser2Eth.packet_end[portid]=false;
packet_flags.Ser2Eth.protocol_payload_size[portid]=packet_flags.Ser2Eth.protocol_payload_size[portid]+l_size;
temp=数据包标志。第二个协议有效负载大小[portid];
}
else if((pre_more_fragment==1)和&(MoreFragmentFlag==0)){
packet_flags.Ser2Eth.packet_end[portid]=true;
packet_flags.Ser2Eth.protocol_payload_size[portid]=packet_flags.Ser2Eth.protocol_payload_size[portid]+l_size;
temp=数据包标志。第二个协议有效负载大小[portid];
}
如果(MoreFragmentFlag==1){
pre_more_frag=1;
}
否则{
pre_more_frag=0;
}
int-ff=0;
if(packet_flags.Ser2Eth.packet_end[portid]==true){
packet_flags.Ser2Eth.packet_start[portid]=false;
packet_flags.Ser2Eth.packet_start[portid]=false;
设置端口id标志(portid,packet,flags.Ser2Eth.protocol,有效负载大小[portid],ProtocolID);
pre_more_frag=0;
}
提醒的_数据=提醒的_数据-6-l_大小;
//ui.lableSocketRead->setText(ddcmp_datap.toHex());
框架尺寸=框架尺寸-l尺寸-6;
}//时间结束(帧大小!=0)
uint8_t sync_footer[3];
streamdata.readRawData((char*)和sync_footer,3);
假人尺寸=1446-t尺寸-8;
uint8_t虚拟_数据[1000];
streamdata.readRawData((char*)和dummy_数据,dummy_大小);
总面积=总面积-1446;
如果(总尺寸=0){
tcpSocket_data_buffer_u.clear();
}
}//如果结束
}//while()结束
}

实际上,问题在于tcpSocket\u data\u buffer\u。在这些主题中,据说问题在于它试图访问一个不存在的内存位置。例如,当存在长度为20(arr[])的数组时,我们尝试访问arr[21],就会出现此错误。在我的代码中,这个错误是在读取QByteArray类型的tcpSocket_data_buffer_时发生的。当我收到一个数据包时,我从一开始就知道它的大小,然后我读取整个数据,直到函数结束,它都能正常工作。我希望它退出“while(total_size_rcvd!=0)”,并退出该函数。但是看起来