我很困惑,很抱歉,这很明显,但是:

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/

10-09 07:24