C++ c++;奇怪的字符串大小
我遇到了一个奇怪的字符串大小问题。这是我的示例代码 samreakeC++ c++;奇怪的字符串大小,c++,string,C++,String,我遇到了一个奇怪的字符串大小问题。这是我的示例代码 samreake std::string getexepath() { char result[ PATH_MAX ]; int found; ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX ); found = std::string(result).find_last_of("/"); std::string pp = std:
std::string getexepath()
{
char result[ PATH_MAX ];
int found;
ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX );
found = std::string(result).find_last_of("/");
std::string pp = std::string(result).substr(found+1);
std::string kk = std::string(result).substr(found+1);
std::cout << kk << kk.size() << std::endl;
return kk;
}
std::string getexepath()
{
字符结果[PATH_MAX];
int-found;
ssize\u t count=readlink(“/proc/self/exe”,结果,路径\u MAX);
find=std::string(结果)。查找(“/”)的最后一个;
std::string pp=std::string(result).substr(find+1);
std::string kk=std::string(result).substr(find+1);
std::cout您的猜测是正确的。问题是您忘记设置结果[count]=0
。因此您的代码具有未定义的行为,因为字符数组结果
不是以“\0”结尾的
加上
result[count] = 0;
在found=…
之前,您将获得样本A和样本B的相同结果。您的猜测是正确的。问题是您忘记设置result[count]=0
。因此您的代码具有未定义的行为,因为char数组result
没有以“\0”结尾
加上
result[count] = 0;
在found=…
之前,您将获得样本A和样本B的相同结果。堆栈上result[PATH_MAX]
的内存未初始化,因此结果的内容不确定。如WhozCraig的注释:
readlink()不向buf追加空字节
因此,“\0”可能出现在结果[count-1]
之后的每个地方,并且代码中的输出未定义。当声明C格式字符串时,我们最好这样初始化字符串:字符结果[PATH\u MAX]={0};
。希望这些可以帮助您。内存结果[PATH\u MAX]堆栈上的
未初始化,因此结果的内容不确定。如WhozCraig的注释:
readlink()不向buf追加空字节
因此,“\0”可能出现在result[count-1]
之后的每个位置,并且代码中的输出未定义。当声明C格式字符串时,我们最好像这样初始化字符串:char result[PATH\u MAX]={0};
。希望这些可以帮助您。状态文档:“readlink()所以我很好奇。在使用它构造std::string
之前,注意所描述的功能并将result[count]=0;
设置是否有意义?(假设您实际检查结果是否为(-1),而您目前没有这样做)。文本samack
和sampleB
是否确实出现在您的代码中?您是否真的想设置result[count]
,并将缓冲区增大1个字符?@user2357112。绝对感谢您的锐利目光。在我添加result[count]='\0'后,kk.size()将与以前一样给我。它不会增加“kk”的大小字符串。为什么?文档说明:“readlink()没有向buf追加空字节。”所以我很好奇。在使用它构造std::string
之前,注意所描述的功能并设置result[count]=0;
是否有意义(假设您实际检查结果是否为(-1))文本samamreak
和sampleB
确实出现在你的代码中吗?你难道不想设置result[count]
,并使缓冲区变大1个字符吗?@user2357112绝对感谢你的锐利目光。在我添加result[count]='\0',kk.size()给我和以前一样的。它不会增加“kk”字符串的大小。为什么?你是对的。在添加了result[count]='\0'之后,samreak和B有相同的输出。但是我仍然想知道为什么这个语句“std::string pp=std::string(result).substr(find+1)”始终使A和B不同?我认为行为依赖于实现,因为我使用gcc 4.4.5运行它时,它给出不同的大小,但使用Solaris CC时,它给出相同的大小。你是对的。添加结果[count]='\0'后,Samreak和B具有相同的输出。但我仍然想知道为什么这条语句“std::string pp=std::string(result)”.substr(find+1)“总是使A和B有所不同吗?我认为行为取决于实现,因为我使用gcc 4.4.5运行它,它给出了不同的大小,但使用Solaris CC它给出了相同的大小。