嗨,我正在使用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;
}
是什么原因造成的?以及我该如何解决?
答案 0 :(得分:2)
字符串"app.exe"
的长度为七个字符。这意味着您构造的字符串的总长度将为十个字符。
不幸的是,您似乎忘记了C ++中的char
字符串确实称为 以空值结尾的 字节字符串, 空终止符也需要空格。
由于没有空终止符(字符'\0'
),因此最后一个strcat
调用将超出folderPath
数组的边界,导致undefined behavior (以及您收到的错误)。
简单的解决方案是在数组中添加一个元素,以便为终止符腾出空间:
char folderPath[11];
更正确的解决方案是改用std::string
,而不必担心长度。
由于您正在使用路径,因此建议您使用std::filesystem::path
(如果没有可用的C ++ 17,请使用Boost filesystem path
)。