考虑此片段
char a[]="";
是否将NULL
指针分配给字符指针*a
?
如果没有,如何检查是否没有为a
分配字符串?
答案 0 :(得分:1)
是否将NULL指针分配给字符指针* a?
此处没有没有字符指针,但但是一个{strong> {{1} }}。
a
将被定义为char
的数组,并初始化为包含一个空字符串,即仅携带a
终止符的c字符串,即char
。
如何检查是否已将无字符串分配给a?
因此0
将只有一个元素。此元素比较等于char
,后者又比较等于a
。
要对此进行测试
'\0'
答案 1 :(得分:0)
a
将包含1个元素:
a[0] == '\0'
注意:a
不是指针。
答案 2 :(得分:0)
首先,a
不是字符指针,它是char
的数组。在某些情况下,后者会转换为前者,但是它们本质上不是同一类型。
也就是说,在此初始化中,将使用空字符串初始化数组a
。
空字符串表示,第一个元素将是终止的空字符,因此检查数组是否包含空字符串的最简单方法是将第一个元素与null进行比较,例如
if (a[0] == '\0') { /*do the action*/ }
答案 3 :(得分:0)
==> 是否将空指针分配给字符指针*a
?
数组不是指针。
为了更好地理解,让我们参考C标准#6.7.9p32中的示例 [强调我的观点]
示例8声明
char s[] = "abc", t[3] = "abc";
定义“普通” 字符数组对象
相同s
和t
,其元素用字符串文字初始化。该声明与char s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' };
数组的内容是可修改的。另一方面,声明
char *p = "abc";
使用“类型为char的指针” 类型定义
p
,并将其初始化为指向长度为4的“ char数组”类型的对象,该对象的元素初始化为字符串文字。如果尝试使用p
来修改数组的内容,则该行为是不确定的。
所以,这句话
char a[]="";
定义char
数组对象a
,其对象用字符串文字""
初始化。请注意,""
是一个包含单个字符'\0'
的字符串文字。
上面的语句等同于
char a[] = {'\0'};
如果省略尺寸,编译器将根据初始值设定项的大小为我们计算尺寸(此处将为1
,因为初始值设定项只有一个字符'\0'
)。因此,声明与
char a[1] = {'\0'};