【问题标题】:array assignment access violation数组赋值访问冲突
【发布时间】:2013-06-23 14:50:34
【问题描述】:

我已经阅读了许多与此问题相似但尚未找到任何答案的问答: 我必须对 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;
}

任何帮助将不胜感激

【问题讨论】:

  • 好吧,分配一个byte,然后使用它,因为它还有更多。
  • byte *Packet1 = Readstr;替换byte *Packet1 = new byte;
  • 但我不知道数组的大小。我应该使用一个大的初始化数组和我填写的字节数吗?我在同一个函数中有很多吸块,我打算在所有块中使用那个“Packet1”,因为它只是一个地址
  • @ctn no ReadstrPacket1 没有任何关系,我应该编辑我的函数以免被误解
  • @arianoo 你知道大小:它是add + 8,你甚至在调用SerialPort.Write 时这么说(但你对add 的计算看起来很奇怪)。

标签: c++ arrays visual-c++


【解决方案1】:

我看不出它是如何工作的。您在堆上分配一个字节,但将其视为多个字节:

byte *Packet1 = new byte;
*Packet1 = 0x01;
*(Packet1+1) = 'P';  // !!!
*(Packet1+2) = '1';  // !!!
*(Packet1+3) = STX;  // !!!
*(Packet1+4) = '(';  // !!!

【讨论】:

  • 或者更确切地说是byte *Packet1 = new byte[add+8];
  • 您的解决方案工作得很好,为了我的目标,我在每个块中使用我想要的新大小再次删除并初始化数组。非常感谢您指出我的问题
【解决方案2】:

这里你只分配一个字节

byte *Packet1 = new byte;

然后使用超出分配内存的指针

*(Packet1+1) = 'P';
*(Packet1+2) = '1';
*(Packet1+3) = STX;
*(Packet1+4) = '(';

这会导致未定义的行为,有时它可能会起作用。所以你想要类似的东西

byte Packet1 = new byte[size]

大小适合您的需要(可能是add + 8,因为这是您在该函数中写入的字节数)。然后用delete[] 删除它。你也可以使用栈分配,或者std::vector&lt;byte&gt;,因为这是c++。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多