我很困惑,很抱歉,这很明显,但是:
int main()
{
char stringDest[20];
char stringSource[20];
strcpy_s(stringDest, stringSource);
return 0;
}
引发异常“缓冲区太小”。鉴于:
char stringSource[20];
int main()
{
char stringDest[20];
strcpy_s(stringDest, stringSource);
return 0;
}
工作良好。
此外,我认为安全
strcpy_s(dest, size, source)
的要点是您指定要复制的字节数,但是当我这样做时:int main()
{
char stringDest[20];
char stringSource[20];
strcpy_s(stringDest, 1, stringSource);
return 0;
}
我得到“缓冲区太小异常”。
我感到很困惑。为什么在
main()
之外声明变量会有所不同?为什么指定要复制的1个字节是错误的? 最佳答案
给我一个未处理的RangeChecks异常,而:
C的数组索引为零,这表示对于char stringSource[20];
,元素从0到19,当您执行stringSource[20] = '\0';
时,访问超出数组范围,这将导致不确定的行为。
引发异常“缓冲区太小”。鉴于:
这是因为stringSource
是自动存储的,并且没有初始化为有效的字符串,因此使用它会导致未定义的行为。
在第二种情况下,当您将char stringSource[20];
放到函数之外时,该数组是静态存储,默认情况下将其初始化为零值,实际上与char stringSource[20] = "";
相同,这就是这种情况下strcpy
成功的原因。
关于c++ - 字符串复制表示缓冲区太小,strcpy_s源问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37187271/