检查';中的空字符时出现异常行为;C';
为了澄清这一点,我编写了下面给出的两个小测试程序检查';中的空字符时出现异常行为;C';,c,pointers,null,C,Pointers,Null,为了澄清这一点,我编写了下面给出的两个小测试程序 #include <stdio.h> int main(int argc, char *argv[])
#include <stdio.h>
int main(int argc, char *argv[])
{
char *p = "ab";
p++;
p++;
if (*p)
printf("p is not NULL \n");
else
printf("ps is NULL \n");
return 0;
}
#包括
int main(int argc,char*argv[])
{
char*p='\0';
如果(*p)
printf(“p不为空\n”);
其他的
printf(“ps为空\n”);
返回0;
}
上面的程序将字符指针p
初始化为空字符\0
。如果我编译并运行该程序,就会出现分段错误。有人能解释一下吗
这两种情况的唯一区别是空字符位于位置
0
和位置2
。否则程序看起来与我相同。您正在用int
值初始化char*
。如果启用“警告”,编译器应该对此发出警告。尝试:
char *p = "\0";
用双引号
请注意,NUL(代码为0的字符)和NULL(不指向任何内容的指针值)是非常不同的事情。理解NULL指针(
NULL
)和NULL*字符('\0'
)之间的区别很重要
这将正确地将指针p
设置为指向字符串“ab”
末尾的空字符
这将p
设置为空指针。将'\0'
用作空指针常量的方式不好,但合法(任何值为零的常量整数表达式都是有效的空指针常量)。上述内容相当于以下内容:
char *p = NULL;
任何取消引用p
的尝试都有未定义的行为,可能会使程序崩溃
这两种情况的唯一区别是NULL
字符位于位置0和位置2
如果要在位置0处使用空字符(而不是null
character),可以编写:
char *p = "\0";
或者,几乎相当于:
char *p = "";
空字符串仅由终止的
'\0'
空字符组成。在C中,'\0'
是一个整数表达式,因此您有char*p=0代码>。因此,p
是一个空指针
另外,请注意指针和字符之间的区别
见:
根据语言定义,指针上下文中值为0的整型常量表达式在编译时转换为空指针。也就是说,在初始化、赋值或比较中,当一端是指针类型的变量或表达式时,编译器可以判断另一端的常量0请求空指针,并生成正确类型的空指针值。因此,以下片段完全合法:
char *p = 0;
if(p != 0)
这两种情况的唯一区别是空字符位于位置0和位置2“
这是完全错误的。这两个程序实际上非常不同
第一个程序使用类型为char[3]
的数组初始化p
。数组衰减为指针类型,这使得p
指向存储在内存中某处的字符串“ab”
。该字符串以\0
值结尾,位置2
,这正是您观察到的
第二个程序使用字符常量\0
初始化p
。该常量具有类型int
和值0
。此初始化使用空指针值初始化p
。这相当于执行以下操作
char *p = NULL;
结果p
不指向任何地方。检查*p
会导致未定义的行为
如果你想让你的第二个程序与第一个程序相似,你就必须按照你的意愿去做
char *p = "\0";
或者只是
char *p = "";
注意双引号。这将使p
指向内存中的\0
值。但是
char *p = '\0';
使用单引号是完全不同的情况,如上所述。char*p='\0';
将p的值设置为NULL。它不会初始化p以指向NULL。建议:尝试char*p=“\0”
或char*p=“”;
。尝试查看程序集输出(Linux上的gcc-S,或Windows上的cl/Fa)。您正在引用一个空指针。null字符位于位置0
:char*p=“”;
*p是一个字符指针,您用字符指针“ab”初始化它,一切正常。“\0”不是字符或指针,而是整数0。我怀疑您想要的是”“@ssnobody:取消引用,而不仅仅是引用。引用空指针是无害的(如ptr=null;
)。我也正要发布它。实际上'\0'
的类型是int
,而不是char
——而且它恰好是一个有效的空指针常量(尽管以这种方式使用它是个坏主意)。这是错误的;问题被标记为c
。在C语言中,字符文字的类型为int
。因此,'\0'
是一个值为零的整数常量表达式,因此它是一个空指针常量。如果编译器在此初始化时发出诊断,则它是不一致的。“空字符”甚至不称为空字符。它是NUL字符(正是因为我们需要避免混淆整数0和空指针)。@TheParamagneticCroissant:是的,它是。5.2.1p2:“基本执行字符集中应存在一个所有位均设置为0的字节,称为空字符;它用于终止字符串。”@ParamagneticCroissant可能是因为Windows有NUL
,而Linux/UNIX有/dev/null
?除了Keith对null字符的引用之外,还有一个null指针,我们不称它为nul指针。@localhost:null字符通常被称为nul
。我相信
char *p = NULL;
char *p = "\0";
char *p = "";
char *p = '\0';