Sizeof vs Strlen

﹥>﹥吖頭↗ 提交于 2019-11-26 13:01:48

问题


#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;
}

Output:

the size of september is 8 and the length is 9

Is there something wrong with my syntax or what?


回答1:


sizeof and strlen() do different things. In this case, your declaration

char string[] = "october";

is the same as

char string[8] = "october";

so the compiler can tell that the size of string is 8. It does this at compilation time.

However, strlen() counts the number of characters in the string at run time. So, after you call strcpy(), string now contains "september". strlen() counts the characters and finds 9 of them. Note that you have not allocated enough space for string to hold "september". This is undefined behaviour.




回答2:


The Output is correct because

first statement string size was allocated by compiler that is 7+1 (October is 7 bytes & 1 byte for null terminator at compile time)

Second statement: you are copying September (9 bytes to 8 bytes string);

there for you got size of September as 8 bytes (still strlen() will not work for September it does not have null character)




回答3:


Your destination array is 8 bytes (length of "october" plus \0) and you want to put in 9 chars in that array.

man strcpy says: If the destination string of a strcpy() is not large enough, then anything might happen.

Please tell me what you really want to do, because this smells bad long way




回答4:


You must eliminate buffer overflow problem in this example. One way to do this - is to use strncpy:

memset(string, 0, sizeof(string));
strncpy(string, "september", sizeof(string)-1);


来源:https://stackoverflow.com/questions/9937181/sizeof-vs-strlen

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!