Sizeof vs Strlen

时间:2012-03-30 04:52:29

标签: c sizeof 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

我的语法有什么问题或什么?

4 个答案:

答案 0 :(得分:40)

sizeofstrlen()执行不同的操作。在这种情况下,您的声明

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