我试图找到NULL
和""
当我尝试a=strlen("");
时,输出为零。
当我尝试a=strlen(NULL);
时,我遇到了核心转储错误。
这两个陈述究竟发生了什么?内存是否会分配给""
答案 0 :(得分:6)
文字""
是一个以空字符结尾的字符串,由长度为一的数组组成,其中包含空终止字符'\0'
。另一方面,NULL
是空指针,而不是以空字符结尾的字符串。它没有指向内存中的任何有效位置,也无法取消引用。
strlen
要求其参数为空终止字符串,否则会产生未定义行为(UB)。在这种情况下,UB很可能是由取消引用NULL指针引起的。最重要的是,您只能传递以空值终止的字符串或所有投注都已关闭。
答案 1 :(得分:1)
strlen()的定义表明,
size_t strlen( const char *str );
它将返回C字符串str
的长度。但
如果
str
指向的字符数组中没有空字符,则行为未定义。
在
a=strlen(NULL);
NULL
(空指针,不指向任何内容)没有空字符,因此您发现了未定义的行为。
答案 2 :(得分:1)
strlen
给出字符串的长度,直到'\0'
表示字符串终止。
NULL
是一个空指针。它是一个常量,在stdio.h
中定义。因此strlen
给出了未定义的行为。
其中""
是包含null character
的字符串,因此strlen
提供0
。