我读过许多Q& A,它们似乎与此问题类似但尚未找到任何答案:
我必须在fillbyte
函数中对动态字节数组进行一些赋值,如下所示:
int Error;
result = fillbyte (&Error);
如果我评论下面显示的行,一切正常。但如果该行被执行,第二次调用此函数时,将引发访问冲突异常,但是第一次代码正常运行并且一切正常。我似乎无法找到这行代码或用密码字节填充数组的其他方法的问题。
Bool fillbyte(int *Error)
{
byte BCC;
byte *Packet1 = new byte;
*Packet1 = 0x01;
*(Packet1+1) = 'P';
*(Packet1+2) = '1';
*(Packet1+3) = STX;
*(Packet1+4) = '(';
int add = sizeof(readingprops.password)*2;
for(int i=0;i<add;i++)
{
*(Packet1+(5+i)) = readingprops.password[i]; //this line raises the problem
}
*(Packet1+add+5) = ')';
*(Packet1+add+6) = ETX;
BCC = calc.CalcBCC(Packet1,add+7);
*(Packet1+add+7) = BCC;
SerialPort.Write(Packet1,add+8);
delete Packet1;
return true;
}
任何帮助将不胜感激
答案 0 :(得分:3)
我看不出它是如何工作的。您在堆上分配一个字节,但将其视为多个字节:
byte *Packet1 = new byte;
*Packet1 = 0x01;
*(Packet1+1) = 'P'; // !!!
*(Packet1+2) = '1'; // !!!
*(Packet1+3) = STX; // !!!
*(Packet1+4) = '('; // !!!
答案 1 :(得分:3)
这里只分配一个字节
byte *Packet1 = new byte;
然后使用超出分配内存的指针
*(Packet1+1) = 'P';
*(Packet1+2) = '1';
*(Packet1+3) = STX;
*(Packet1+4) = '(';
这会导致未定义的行为,有时它可能会起作用。所以你想要像
这样的东西byte Packet1 = new byte[size]
其中size适合您的需要(可能是add + 8
,因为这是您在该函数中写入的字节数)。然后使用delete[]
删除它。您也可以使用堆栈分配,或std::vector<byte>
,因为这是c ++。