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)”,并退出该函数。但是看起来