Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;奇怪的字符串大小_C++_String - Fatal编程技术网

C++ c++;奇怪的字符串大小

C++ 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:

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

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::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它给出了相同的大小。