constchar*行为怪异
const char* acts weird
所以我最近在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.Salt
从const char*
强制转换为仅char*
才能编译代码。
在你改变了字符串文字所占用的内存后,所有的赌注都会落空。你会看到未定义的行为在起作用,这可能是存储字符串文字数据的进程中内存空间的永久损坏。这就是为什么价值在其他地方不断涌现的原因。雪上加霜的是,您已经超出了原始字符串的界限,该字符串中没有任何字符(不包括空终止(。
您需要停止将const char*
视为字符串对象。按照您应该使用的方式使用std::string
,或者至少分配一个您实际拥有的缓冲区,用于存储新数据,并使您的char*
指向该缓冲区。
- 为constchar*定义std::begin合法吗
- 如何在c++中将constchar[]转换为char*
- 如何为winsock的send()函数构造constchar*缓冲区
- 返回一个在函数内部填充的constchar*向量是定义良好的行为吗
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- qbyTearray转换为char(不是char*或constchar*)
- constchar*在平行区域内更改其值
- constchar***是什么意思?它是如何从C语言转换为Java语言的
- 如何使用JNA将返回字符串数组(constchar**)的函数映射到Java
- 使用字符串流将pid_t转换为constchar*
- 如何拆分constchar*
- 像这样使用constchar*返回字符串合法吗
- 如何使用就地constchar*作为std::string内容
- 从函数返回constchar*的正确方法,例如,重写std::exception::what()
- C++:char**到constchar**的转换
- 如何从C风格的constchar*数组中提取整数
- 如何初始化constchar**数组
- char*和constchar*之间的转换
- 如何在constchar*上执行std::find
- constchar*用一个字符测试相等性