C++ 为什么';即使目标阵列很小,strcpy也会抛出错误?

C++ 为什么';即使目标阵列很小,strcpy也会抛出错误?,c++,c++11,C++,C++11,我在两个目标数组小于源数组的字符数组上使用strcpy。但strcpy似乎并不在意。事实上,它无耻地将源阵列复制到目标阵列,我甚至可以复制新的目标阵列 #include <iostream> #include <cstring> int main(){ char src_str[10] = {'D','e','s'}; char dst_str[2] = {'S', 'r'}; strcpy(dst_str, src_str); st

我在两个目标数组小于源数组的字符数组上使用strcpy。但strcpy似乎并不在意。事实上,它无耻地将源阵列复制到目标阵列,我甚至可以复制新的目标阵列

#include <iostream>
#include <cstring>
int main(){
    char src_str[10] = {'D','e','s'};

    char dst_str[2] = {'S', 'r'};

    strcpy(dst_str, src_str); 
    std::cout << dst_str << std::endl;
    std::string stdstr(dst_str);
    std::cout << "stdstr: " << stdstr << std::endl;

    std::cin.ignore();
}
#包括
#包括
int main(){
char src_str[10]={'D','e','s'};
char dst_str[2]={S',r'};
strcpy(dst_str,src_str);

std::cout怎么可能?它不知道。
strcpy()
在检查长度时没有任何错误。它不能,因为传递给
strcpy()
的只是两个指针,根本没有长度信息


strcpy()
仅从第一个元素的地址开始逐字节复制每个元素,并在复制了零后停止。

为什么?原始内存缓冲区不知道大小。使用支持边界检查的类,如果它对您很重要。未定义的行为是未定义的。您的程序会导致未定义的行为。未定义的意思是程序可以做任何事情,包括您观察到的行为。@ManishVerma从不使用未定义的行为创建代码。这样的代码绝对是不正确的,您不能通过在单个案例中观察到的效果来推断其正确性。@ManishVerma“试图理解实际发生的事情”是没有意义的如果涉及未定义的行为。@ManishVerma如果在源中找到一个零,它就会停止。@ManishVerma在源中没有终止的零。它是一个字符数组,不是一个以null结尾的字符串。它会一直复制,直到找到null为止。这就是问题所在。@EJP不是这样的,只是检查了一下。@ManishVerma阅读了 > StrucP您需要的所有信息都在.Time.@ MaSimVMMA中,情况不是这样的:C++语言规范中的哪些定义了下一个初始化数组的尾随内容?您需要停止猜测并开始阅读。