const char *行为怪异

时间:2016-08-20 11:12:08

标签: c++ char

所以我最近在我的C ++项目中遇到了一些非常奇怪的错误!我从TCP客户端收到一个32字符长的字符串并将其存储在const char *中,如下所示:

serverData.Salt = "";
NetDll_recv(XNCALLER_SYSAPP, Sock, serverData.Salt, 32, 0);
if (!(serverData.Salt != NULL))
    return false;
printf("Salt: %s\n", serverData.Salt);
serverData.Salt = "";

将它存储在serverData.Salt中后(如你所见)我将它打印到我的调试控制台,但现在奇怪的是...所有const char *或char *我声明像

const char* example = "";

有这个serverData.Salt的值,除了我发布的代码行之外,我从不对serverData.Salt做任何事情,这就是我寻求帮助的原因,因为这搞砸了我整个项目...

提前致谢:)

顺便说一下,这是结构:

struct ServerData
{
    const char* Salt;
};
ServerData serverData;

编辑:

这是一个例子: 所以我做了上面发布的所有代码,后来在我的Project中初始化变量得分:

const char *Score = "";

它""因为我当时不需要它,它将被放置在屏幕上,作为一个会在游戏时显示用户得分的hudelement,现在让我们采取" 12345"作为服务器返回并写入serverData.Salt的内容,所以现在如果我在游戏的主菜单中得分应为""但它是" 12345"即使我在这段时间从未对代码做过任何事情......所以它有点得到了serverData.Salt的价值

1 个答案:

答案 0 :(得分:2)

您无法将字符存储在const char*中;你只能指向某个缓冲区的const char*。在这种情况下,您要求NetDll_recv将其数据存储在来自字符串文字("")的缓冲区中。坏与坏!

您已经知道这是坏事和错误,因为虽然您没有告诉我们,但您必须将serverData.Saltconst char*投射到char*以使代码编译。

在你改变字符串文字所占用的内存后,所有的赌注都会被取消。您正在看到未定义的行为正在运行,可能是您的进程内存储字符串文字数据的内存空间的永久损坏。这就是为什么价值不断涌现在其他地方。为了增加对伤害的侮辱,你已经 way 超出原始字符串的边界,原始字符串中没有字符(不计算空终止)。

您需要停止将const char*视为字符串对象。要么像你应该使用std::string,要么至少分配一个你实际拥有的缓冲区来存储新数据,并使char*指向它。