constchar*行为怪异

const char* acts weird

本文关键字:constchar      更新时间:2023-10-16

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

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

在将其存储在serverData.Salt中后(如您所见(,我将其打印到调试控制台,但现在出现了奇怪的事情…我声明的所有const char*或char*都像一样

const char* example = "";

有这个serverData的价值。Salt,我从来没有对serverData做过任何事情。除了我发布的代码行,这就是我寻求帮助的原因,因为这把我的整个项目搞砸了。。。

提前感谢:(

顺便说一下,这是结构体:

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

编辑:

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

const char *Score = "";

它是",因为当时我不需要它,它会被放在屏幕上,作为一个hudelement,当我在游戏中时会显示用户的分数,现在让我们把"12345"作为服务器返回并写入serverData的内容。盐,所以现在如果我在游戏的主菜单上,分数应该是"但它是"12345",尽管我在这个时候从未在代码中对它做过任何事情。。。所以它得到了serverData.Salt 的值

不能将字符"存储"在const char*中;您只能有一个指向某个缓冲区的const char*。在本例中,您要求NetDll_recv将其数据存储在来自字符串文字(""(的缓冲区中。糟糕和错误!

您已经知道这是糟糕和错误的,因为尽管您没有告诉我们,但您必须将serverData.Saltconst char*强制转换为仅char*才能编译代码。

在你改变了字符串文字所占用的内存后,所有的赌注都会落空。你会看到未定义的行为在起作用,这可能是存储字符串文字数据的进程中内存空间的永久损坏。这就是为什么价值在其他地方不断涌现的原因。雪上加霜的是,您已经超出了原始字符串的界限,该字符串中没有任何字符(不包括空终止(。

您需要停止将const char*视为字符串对象。按照您应该使用的方式使用std::string,或者至少分配一个您实际拥有的缓冲区,用于存储新数据,并使您的char*指向该缓冲区。