当我尝试将一个字符串的值分配给其他使用strcpy
运行时错误时。代码下方:
int main (int argc, char **argv)
{
char str[5];
char str2[5];//if set size of str2 equal to 6, no error occurs
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = 'd';
str[4] = 'e';
cout<<sizeof(str)<<endl;
cout<<str[0]<<endl;
cout<<str[1]<<endl;
cout<<str[2]<<endl;
cout<<str[3]<<endl;
cout<<str[4]<<endl;
strcpy(str2,str);
cout<<sizeof(str2)<<endl;
cout<<str2[0]<<endl;
cout<<str2[1]<<endl;
cout<<str2[2]<<endl;
cout<<str2[3]<<endl;
cout<<str2[4]<<endl;
getch();
return 0;
}
错误是:
Run-Time Check Failure #2 - Stack around the variable 'str' was corrupted
如果我将str2的大小设置为等于6或更多,则程序运行良好。 这有什么问题?
答案 0 :(得分:7)
strcpy
对零终止字符串进行操作。您的char数组没有终止零字节。
如果在将数组声明为[6]
时它正在工作,那只是偶然的。
答案 1 :(得分:5)
函数strcpy();
期望nul \0
终止字符串。 str[]
并非\0
终止。
因为您在代码中使用char打印数组char,所以可以使用memcpy而不是strcpy按照@ Karoly Horvath的建议来纠正代码。
void * memcpy ( void * destination, const void * source, size_t count );
memcpy(str2, str, sizeof(str));
答案 2 :(得分:3)
使用字符串操作而不形成以空字符结尾的字符串是非常危险的。
这里,strcpy()期望将一个以空字符结尾的字符串复制到一个也必须以null结尾的字符串。
因此你必须使用:
char str[6];
char str2[6];
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = 'd';
str[4] = 'e';
str[5] = '\0';
strcpy(str2,str);