Sizeof vs Strlen
#include "stdio.h" #include "string.h" main() { char string[] = "october"; // october is 7 letters strcpy(string, "september"); // september is 9 letters printf("the size of %s is %d and the length is %d\n\n", string, sizeof(string), strlen(string)); return 0; } 输出:
9月份的大小是8,长度是9
我的语法有什么问题吗?
  sizeof和strlen()做不同的事情。 在这种情况下,你的声明 
 char string[] = "october"; 
是相同的
 char string[8] = "october"; 
 所以编译器可以知道string的大小是8.它在编译时会这样做。 
 但是, strlen()计算运行时string中的字符数。 所以,在调用strcpy() , string现在包含“september”。  strlen()计算字符并find9个字符。 请注意,您没有为string分配足够的空间来保存“九月”。 这是未定义的行为。 
输出是正确的,因为
第一个语句的string大小是由编译器分配的,即7 + 1(编译时10月份为7个字节,1个字节为空终止符)
第二条语句:你正在复制9月份(9字节到8字节的string);
 那里为9月的大小为8个字节(仍然strlen()将不会在九月它不具有空字符) 
你的目标数组是8个字节(“october”的长度加上\ 0),并且你想在这个数组中放入9个字符。
  man strcpy说:如果strcpy()的目标string不够大,那么可能会发生任何事情。 
请告诉我你真的想做什么,因为这味道很长
 在这个例子中你必须消除缓冲区溢出问题。 一种方法是使用strncpy : 
 memset(string, 0, sizeof(string)); strncpy(string, "september", sizeof(string)-1);