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);