下面是我尝试打印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);