C++ strcmp的两种场景

C++ strcmp的两种场景,c++,string,C++,String,我必须写一个错误服务器,将崩溃由于关闭一个错误我的疑问是,为什么下面的代码会出现分段错误 char wbuff[5]; char abuff[5]= "12345"; strcpy(wbuff,abuff); 但是下面的代码没有 char buf[BUFSIZE]; char wbuf[5]; n = read(connfd, buf, BUFSIZE); // read input string from client strcpy(wbuf,buf); // strlen(buf) is

我必须写一个错误服务器,将崩溃由于关闭一个错误我的疑问是,为什么下面的代码会出现分段错误

char wbuff[5];
char abuff[5]= "12345";
strcpy(wbuff,abuff);
但是下面的代码没有

char buf[BUFSIZE];
char wbuf[5];
n = read(connfd, buf, BUFSIZE); // read input string from client
strcpy(wbuf,buf); // strlen(buf) is greater than 5

第一个从非空终止字符串(abuff)复制到另一个字符串。所以它从abuff的末尾走出来,直到找到一个零字节,这可能是一个非常复杂的过程,并导致segfault。另一个从正确终止的字符串(buf)复制到较小的字符串wbuf,并在复制strlen(buf)+1字节后停止复制。因此,第一个更可能导致segfault,但两者都是错误。

超出数组大小是未定义的行为。事情可能会发生。如果您现在没有SIGSEGV,您可以在以后的程序运行中获得它。

第一个甚至可以编译吗?编辑:“.12345”需要6个字符(不要忘记最后一个“null”/终止符,
'\0'
);在第二种情况下,BUFSIZE是。。。?如果它大于5,并且在前5个字节中没有出现
'\0'
,则strcpy仍将溢出。您发布的代码本身不正确。它应该在这里出错
charabuff[5]=“12345”原因必须为6才能容纳
\0
null
字符。
char abuff[5]=“12345”在C语言中是合法的;它将
“12345”
存储在
abuff
中,不终止
'\0'
。在C++中是非法的,但是也许一些C++编译器允许它。@ RaHuL:<代码> CHAR abuff[5 ] =“12345”;<代码>实际上不是一个错误。这是标准允许的,它只会将给定的5个字符放入数组的5个元素中。不过,这大概不是他想要的,所以这肯定是一个逻辑错误。