我遇到了一个奇怪的字符串大小问题。这是我的示例代码
sampleA
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;
}
sampleB
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;
}
输出不同; sampleB输出比sampleA多2个char。我猜差异是'\0'
; sampleB输出包括'\0'
,而sampleA不包括。
我想知道导致问题的原因。 在回答了答案之后,现在我知道我错过了'\ 0'。但我仍然想知道为什么添加这个语句“std :: string pp = std :: string(result).substr(found + 1)”会导致差异结果。
由于
答案 0 :(得分:2)
你猜是对的。问题是您忘了设置result[count]=0
。因此,您的代码具有未定义的行为,因为char数组result
不会被'\ 0'终止。
添加
后 result[count] = 0;
在found = ...
之前,您将获得样本A和样本B的相同结果。
答案 1 :(得分:1)
堆栈上result[ PATH_MAX ]
的内存未初始化,因此结果的内容未经确认。像WhozCraig的评论一样:
readlink()不会向buf附加空字节。
所以'{0'可能出现在result[ count-1 ]
之后的每个地方,并且代码中的输出是未定义的。声明C格式字符串时,我们最好初始化字符串,如下所示:char result[ PATH_MAX ] = {0};
。希望这些可以帮助你。