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

我的语法有什么问题吗?

sizeofstrlen()做不同的事情。 在这种情况下,你的声明

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