空char *成功转换为有效的无符号int64游戏ID?怎么样?

时间:2013-05-28 02:53:10

标签: c++ stringstream uint64 char-pointer

我正在制作一个游戏而且我遇到了一个奇怪的小问题...我想知道这里是否有人能够解决这个问题并向我解释(它正在吞噬我!)

首先,这是相关的代码。

// even if this data is not set, it returns ""
// so it's pretty much never null
// but if the function returns something, 
// it will be the string representation of a 64bit unsigned int
const char* c_KickID = GetGameData("kick_member_id");

//gets my ID, works fine.
unsigned long long myID = GetMyID();

if(c_KickID != NULL)
{
    //here i convert it to a unsigned 64-bit int
    unsigned long long kickID;
    std::stringstream ss(c_KickID);
    ss >> kickID;

    //now I compare the IDs...
    if (myID == kickID)
    {
        //kick player
    }
}

该游戏是1对1多人游戏。这个包含函数是一个回调函数,只要发生了一些值得注意的事情(比如踢一个玩家或开始一个游戏)就会运行。我有两台电脑,我正在测试在线资料(Windows 7机器和Windows XP机器)。

在这种情况下,当两个玩家同时按下“开始游戏”时,会出现一个奇怪的错误可靠。 Windows XP机器播放器将被踢(通过上面的代码) - 这表明GetGameData("kick_member_id")返回了他的ID ...除非它没有。

调试:

  • 我已经注释掉了设置GameData“kick_member_id”值的代码(即禁用踢)以确保 - 并且错误继续发生。 主持人没有踢客户端。
  • 我已将c_KickID输出到文件中并且它是空的(XP机器没有Visual Studio,因此我无法在其上设置断点,因此我只将其内容输出到文件中)。
  • 我试图明确地踢XP玩家。他们的ID已成功写入输出文件,并按预期踢了它们。
  • 我已将kickID输出到某个文件,它等于myID,这就解释了if (myID == kickID)通过的原因。

回顾一下:

// This returns an empty char array
const char* c_KickID = GetGameData("kick_member_id");

//get my id... 
unsigned long long myID = GetMyID();

//Then I run this. Keeping in mind, c_KickID is empty
unsigned long long kickID;
std::stringstream ss(c_KickID);
ss >> kickID; //<--- now kickID == myID

所以...在将空c_KickID转换为unsigned long long时,它被设置为myID ......这怎么可能?我完全失去了理智!

我已修复此问题,方法是将char *转换为std::string并检查是否为空,如果它为空,则我只是绕过此代码。但我仍然不知道问题究竟是什么。我正在为此而失眠!!!

1 个答案:

答案 0 :(得分:3)

如果c_KickID是一个空的以空字符结尾的字符串,则字符串流ss也将为空,ss >> kickID将不会产生任何影响。

由于kickID未初始化,因此未指定其值,并且使用它未定义。一种可能的结果是它在堆栈中的那个内存位置有任何随机位,可能等于myID