C linux中sizeof和strlen之间的区别

时间:2014-04-25 12:34:08

标签: c linux sizeof strlen

第一个printf语句给出输出3,第二个给出20。 任何人都可以解释这两者之间有什么区别吗?

char frame[20],str[20];
printf("\nstrlen(frame)= %d",strlen(frame));
printf("\nsizeof(frame) = %d",sizeof(frame));

谢谢:)

3 个答案:

答案 0 :(得分:6)

sizeof是一个编译时运算符,用于确定类型消耗的字节大小。如果framechar[20])为20个字节。

strlen是一个运行时函数,它扫描给定的指针,直到第一次出现nul终止符'\0'为止返回字符数。

答案 1 :(得分:5)

  1. 由于frame的内容未初始化,这意味着它不是有效的C字符串,因此strlen(frame)可能会返回任何值或崩溃。实际上,在这种情况下,它的行为是不确定的。

  2. 由于frame是一个包含20个字符的数组,因此sizeof(frame)将返回20 * sizeof(char),它将始终为20(sizeof(char)始终等于1)。< / p>

答案 2 :(得分:3)

strlen实际上给出了字符串的长度,而sizeof给出了分配内存的大小(以字节为单位)。这里有一个很好的解释http://www.cplusplus.com/reference/cstring/strlen/下面给出的提取物。

  

C字符串的长度由终止空字符确定:AC字符串与字符串开头和终止空字符之间的字符数一样长(不包括终止空字符本身)。 / p>      

这不应该与保存字符串的数组的大小混淆。例如:

     

char mystr [100] =&#34; test string&#34 ;;

     

定义了一个大小为100个字符的字符数组,但是初始化了mystr的C字符串的长度只有11个字符。因此,当sizeof(mystr)的计算结果为100时,strlen(mystr)返回11。

是的,根据其他评论,你试图获得未初始化字符串的长度并导致未定义的行为,它可以是3或其他任何东西,这取决于为你的字符串分配的内存中存在的任何垃圾。