2

我的代码有问题。当我运行代码时,短“操作码”的值是错误的52496。所以我逐步调试代码......当我这样做时,“操作码”的值是正确的 4624!有人可以给我一个提示吗?

void packet_get()
{
    boost::shared_ptr<boost::array<unsigned char, 2>> opc(new boost::array<unsigned char, 2>);
    recv_two_bytes(opc);
    unsigned short opcode;

    unsigned char * test[2];
    test[0] = &opc->at(0);  // *test[0] == 0x12
    test[1] = &opc->at(1);  // *test[1] == 0x10

    opcode = 0;
    int i = 0;
    for(i = 0; i <= 1; i++)
    {
        opcode = (opcode<<8) | *(test[i]);
    }
    // opcode should now be short 4624
}
4

1 回答 1

3

通常,当程序在正常运行和调试运行之间的行为不同时,这是由于未定义的行为。一个这样的常见错误是未初始化的变量。

当您执行一个程序时,它会得到一个很可能未初始化的堆栈。在调试模式下,调试器可以初始化此堆栈。因此,未初始化的变量在调试和正常执行中很容易具有不同的值(即使在调试模式下为 0,大多数情况下您实际上想要给变量但忘记了)。

似乎您的recv_two_bytes函数中有类似的错误。如果问题更微不足道,则启用编译器上的所有警告将有助于确定问题。

请注意其他错误,例如从数组中索引。

于 2012-05-05T01:09:26.833 回答