0

我遇到了一个奇怪的字符串大小问题。这是我的示例代码

样品A

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;
}

样品B

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 个字符。我想区别是'\0'; sampleB 输出包含'\0',而 sampleA 不包含。

我想知道是什么导致了这个问题。在查看答案后,现在我知道我错过了“\0”。但我仍然想知道为什么添加这个语句“std::string pp = std::string(result).substr(found+1)”会导致不同的结果。

谢谢

4

2 回答 2

2

你猜对了。问题是您忘记设置result[count]=0. 因此,您的代码具有未定义的行为,因为 char 数组result未由 '\0' 终止。

添加后

    result[count] = 0;

之前found = ...,对于样本 A 和样本 B,您将得到相同的结果。

于 2013-08-29T01:27:07.750 回答
1

栈上的内存result[ PATH_MAX ]没有初始化,所以结果的内容是不确定的。就像 WhozCraig 的评论一样:

readlink() 不会将空字节附加到 buf。

所以 '\0' 可能出现在 之后的每个地方result[ count-1 ],并且代码中的输出是未定义的。在声明 C 格式字符串时,我们最好像这样初始化字符串:char result[ PATH_MAX ] = {0};. 希望这些可以帮助你。

于 2013-08-29T02:27:37.990 回答