检查';中的空字符时出现异常行为;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';