第一个printf语句给出输出3,第二个给出20。 任何人都可以解释这两者之间有什么区别吗?
char frame[20],str[20];
printf("\nstrlen(frame)= %d",strlen(frame));
printf("\nsizeof(frame) = %d",sizeof(frame));
谢谢:)
答案 0 :(得分:6)
sizeof
是一个编译时运算符,用于确定类型消耗的字节大小。如果frame
(char[20]
)为20个字节。
strlen
是一个运行时函数,它扫描给定的指针,直到第一次出现nul终止符'\0'
为止返回字符数。
答案 1 :(得分:5)
由于frame
的内容未初始化,这意味着它不是有效的C字符串,因此strlen(frame)
可能会返回任何值或崩溃。实际上,在这种情况下,它的行为是不确定的。
由于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或其他任何东西,这取决于为你的字符串分配的内存中存在的任何垃圾。