#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
我的语法有什么问题或什么?
答案 0 :(得分:40)
sizeof
和strlen()
执行不同的操作。在这种情况下,您的声明
char string[] = "october";
与
相同char string[8] = "october";
因此编译器可以判断string
的大小是8.它在编译时执行此操作。
但是,strlen()
计算运行时字符串中的字符数。因此,在您致电strcpy()
后,string
现在包含“9月”。 strlen()
对字符进行计数并找到其中的9个字符。请注意,您没有为string
分配足够的空间来保存“9月”。这是未定义的行为。
答案 1 :(得分:2)
输出正确,因为
第一个语句字符串大小由编译器分配为7 + 1(10月为7个字节,在编译时为空终止符为1个字节)
第二个声明:你正在复制九月(9个字节到8个字节的字符串);
因为你有9月的大小为8个字节(仍然strlen()
将不适用于9月它没有空字符)
答案 2 :(得分:1)
你的目标数组是8个字节(长度为“october”加上\ 0),你想在该数组中放入9个字符。
man strcpy
说:
如果strcpy()的目标字符串不够大,则可能发生任何事情。
请告诉我你真正想做什么,因为这闻起来很糟糕
答案 3 :(得分:-1)
在此示例中,您必须消除buffer overflow问题。一种方法是使用strncpy
:
memset(string, 0, sizeof(string));
strncpy(string, "september", sizeof(string)-1);