变量'folderPath'周围的堆栈已损坏

时间:2018-08-23 12:57:29

标签: c++

嗨,我正在使用Visual Studio,并试图制作一个将自身复制到磁盘的程序,当我运行它时,它确实做到了,但是随后我得到了消息:

"*Run-Time Check Failure #2 - Stack around the variable 'folderPath' was corrupted*."

代码如下:

void copyToDrive(char driveLetter) {
    char folderPath[10] = { driveLetter };
    strcat(folderPath, ":\\");
    strcat(folderPath, FILE_NAME);
    char filename[MAX_PATH];
    DWORD size = GetModuleFileNameA(NULL, filename, MAX_PATH);
    std::ifstream src(filename, std::ios::binary);
    std::ofstream dest(folderPath, std::ios::binary);
    dest << src.rdbuf();
    return;
}

是什么原因造成的?以及我该如何解决?

1 个答案:

答案 0 :(得分:2)

字符串"app.exe"的长度为七个字符。这意味着您构造的字符串的总长度将为十个字符。

不幸的是,您似乎忘记了C ++中的char字符串确实称为 以空值结尾的 字节字符串空终止符也需要空格。

由于没有空终止符(字符'\0'),因此最后一个strcat调用将超出folderPath数组的边界,导致undefined behavior (以及您收到的错误)。

简单的解决方案是在数组中添加一个元素,以便为终止符腾出空间:

char folderPath[11];

更正确的解决方案是改用std::string,而不必担心长度。

由于您正在使用路径,因此建议您使用std::filesystem::path(如果没有可用的C ++ 17,请使用Boost filesystem path)。