字符串连接期间可能的缓冲区溢出

时间:2011-06-17 22:00:31

标签: c++ arrays initialization

我是C ++的新手。我的程序崩溃,我试图找出原因。在代码的某个时刻,我生成一个随机数,然后我复制一个文件,其原始文件名后跟数字

char CopyPath[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_MYMUSIC, NULL, 0, CopyPath);
int randomNumber = 101 + rand()%1000000000;
char randomBuffer[15];
itoa(randomNumber, randomBuffer, 10);

char computerName[MAX_COMPUTERNAME_LENGTH+1];
DWORD size = MAX_COMPUTERNAME_LENGTH;
if(!GetComputerName(computerName, &size))
    strcat(computerName, "FAIL");
strcat(CopyPath,"\\");
strcat(CopyPath, computerName);
strcat(CopyPath, "-");
strcat(CopyPath, randomBuffer);
copyFile(oldpath, CopyPath);

我怀疑崩溃发生在这里的某个地方。我的问题是,因为我没有声明CopyPath的所有值,所以发生了崩溃。我应该将其声明为

char CopyPath[MAX_PATH] = {'\0'}

这可能是问题吗?

4 个答案:

答案 0 :(得分:2)

if(!GetComputerName(computerName, &size))
    strcat(computerName, "FAIL");

这应该是strcpy,因为computerName中没有有效的字符串可以追加。

此外,您可能应该调用SHGetFolderPathA,因为您传递的是char(而不是TCHAR)的缓冲区。

答案 1 :(得分:0)

首选使用std :: string而不是C数组来保存字符串信息,因为它通过=和+运算符提供正确的复制和连接。

答案 2 :(得分:0)

不确定是什么导致您的情况崩溃。我猜它一定是缓冲区溢出问题。你是否考虑MAX_PATH中结束\0字符的空格?

答案 3 :(得分:0)

我相信您已从其他评论中了解到您的代码不是很好(至少由于样式和可能的缓冲区溢出)。

仅考虑您的具体问题 - 您是对的 - 问题在于未初始化的char数组,它不代表C字符串,因为它必须是零终止的。您可能知道strcat适用于C字符串。所以改变:

  char CopyPath[MAX_PATH]; // this is not a C-string

  char CopyPath[MAX_PATH] = {0}; // this is a C-string (empty though)

将解决这个特殊问题。

编辑:这种方法应该与您将用strcat作为连接目标的任何缓冲区一起使用,在您的情况下为computerName