char指针或char变量的默认值是多少



下面是我尝试打印char变量&指针。但无法在控制台上看到它。它是有默认值还是不能读取ASCII范围。?

#include <stdio.h>
int main()
{
char c, *cp;
printf("nValue of char c:%cn", c);
printf("nValue of char ptr:%cn", *cp);
return 0;
}

惊喜!!这里没有"默认"值,您正在冒险进入未定义的行为。

更详细地说,如果变量是本地作用域的,并且自动存储持续时间,除非显式初始化,否则存储的值是不确定的。进一步使用它会导致未定义的行为。

引用C11,第6.7.9章

如果具有自动存储持续时间的对象未显式初始化,则其值为不确定的[….]

  • 对于第一种情况,如果您的char类型可以有陷阱表示,则它将导致UB,否则,它将是一个随机值。

  • 对于第二种情况,在char *类型的情况下,指针包含不确定的值,在程序的上下文中,该值是无效的,因此尝试取消引用指针肯定会调用未定义的行为。

C/C++中的所有automatic变量如果未序列化,都有未定义的值!

实际上,通过使用这些未初始化的变量(更重要的是,通过取消引用指针(,您正在进入"未定义行为"的危险区域。

首先,C和C++是非常不同的语言,通常具有非常不同的语义。

然而,这是一种两者非常相似的情况(尽管规范之间存在差异(:未初始化的局部("自动"(非静态变量将具有不确定值。

在C++中,除了初始化它们之外,以任何方式使用它们都会导致未定义的行为。取消引用一个未初始化的指针几乎加倍。

默认值将是缺省初始化分配的值,对于整数类型(如char(为0,对于任何指针类型为null指针。所以,你的代码在这里已经错了:

printf("nValue of char ptr:%cn", *cp);

因为null指针不能被取消引用,所以它显式地指向任何地方。取消引用它会导致未定义的行为

但是,当您用自动存储持续时间(函数范围中的默认值(定义这些变量时,它们根本不会初始化,除非您自己初始化。因此,它们的初始值只是不确定的。这意味着您的第一行

printf("nValue of char c:%cn", c);

打印一些不确定值。这是否是未定义的行为也取决于默认情况下char是已签名的还是未签名的。允许签名字符具有陷阱表示,因此您可以尝试在此处打印不是char->未定义行为的有效表示的内容

取消引用某些"随机"指针也是未定义的行为(在实践中很可能会使程序崩溃(。

首先,它们不是初始化的为变量赋值。

例如:

char c = 's', *cp = %c;
printf("nValue of char c:%cn", c); 
printf("nValue of char ptr:%cn", *cp);

最新更新