char指针或char变量的默认值是什么

下面是我试图打印char变量和指针的默认值/值的代码。 但无法在控制台上看到它。它是默认值还是只能读取ASCII范围。

#include  int main() { char c, *cp; printf("\nValue of char c:%c\n", c); printf("\nValue of char ptr:%c\n", *cp); return 0; } 

惊喜! 这里没有“默认”值,你冒险进入未定义的行为。

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

引用C11 ,章节§6.7.9

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

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

  • 对于第二种情况,你有一个char *类型,指针保存不确定的值,这在你的程序的上下文中是无效的 ,所以尝试取消引用指针肯定会调用未定义的行为。

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

实际上,你通过使用这些未初始化的变量(通过取消引用指针)来徘徊在“未定义行为”的危险区域。

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

但是,这是两个非常相似的情况(即使规范之间存在差异):未初始化的本地(“自动”)非静态变量将具有不确定的值。

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

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

 printf("\nValue of char ptr:%c\n", *cp); 

因为nullpointer无法解除引用,所以它明确指出。 取消引用它会导致未定义的行为

但是,当您使用自动存储持续时间 (函数范围中的默认值)定义这些变量时 – 除非您自己执行,否则它们根本不会初始化 。 所以,他们的初始价值是不确定的 。 这意味着你的第一行

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

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

取消引用一些“随机”指针也是未定义的行为 (实际上很可能会使程序崩溃)。

首先,它们没有初始化! 为变量赋值。

例如:

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