字符串副本是说缓冲区太小,strcpy_s源问题

Zeb*_*ish -1 c c++ string char strcpy

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

int main()
{
    char stringDest[20];
    char stringSource[20];

    strcpy_s(stringDest, stringSource);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

引发异常"缓冲区太小".鉴于:

char stringSource[20];

int main()
{
    char stringDest[20];

    strcpy_s(stringDest, stringSource);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

工作良好.

此外,我认为安全的要点strcpy_s(dest, size, source)是你指定了复制的字节数,但是当我这样做时:

int main()
{
    char stringDest[20];
    char stringSource[20];

    strcpy_s(stringDest, 1, stringSource);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到一个"缓冲区太小的例外".我感到很困惑.为什么声明外部变量main()会产生影响?为什么指定要复制的1个字节是错误的?

flu*_*ter 5

给我一个未处理的RangeChecks异常,而:

C的数组是零索引的,这意味着char stringSource[20];元素从0到19,当你这样做时stringSource[20] = '\0';,访问超出了数组边界,这导致了未定义的行为.

引发异常"缓冲区太小".鉴于:

那是因为stringSource是自动存储并且没有初始化为有效的字符串,使用它会导致未定义的行为.

而第二种情况,当你char stringSource[20];放出这个函数时,数组是静态存储,它默认初始化为零值,它实际上是相同的char stringSource[20] = "";,这就是为什么这种情况strcpy成功了.