下面是我尝试打印默认值/ char变量和指针的值的代码。但是在控制台上看不到它是否具有默认值,或者只是无法读取ASCII范围。
#include <stdio.h>
int main()
{
char c, *cp;
printf("\nValue of char c:%c\n", c);
printf("\nValue of char ptr:%c\n", *cp);
return 0;
}
答案 0 :(得分:2)
惊喜!!这里没有“默认”值,您正在尝试未定义的行为。
详细说明,如果变量是局部范围的并且具有自动存储期限,除非显式初始化,否则存储的值是不确定的。进一步使用它会导致未定义的行为。引用C11
,第§6.7.9章
如果未自动初始化具有自动存储期限的对象,则其值为 不确定。[....]
对于第一种情况,如果您使用的是char
类型,则在这种情况下可以使用陷阱表示形式,它将导致UB,否则它将是一个随机值
在第二种情况下,如果您使用的是char *
类型,则指针保存不确定的值,该值在程序上下文中为无效,因此请尝试取消引用该指针当然会调用未定义的行为。
答案 1 :(得分:1)
如果未初始化,则C / C ++中的所有automatic
变量都具有未定义的值!
通过使用此类未初始化的变量,您实际上正在徘徊于“未定义行为”的危险区域(此外,通过取消引用指针)。
答案 2 :(得分:1)
首先,C和C ++是非常不同的语言,通常具有非常不同的语义。
但是,在这种情况下,两者非常相似(即使规范之间存在差异):未初始化的局部(“自动”)非静态变量将具有 indeterminate 值。 / p>
在C ++中,以任何方式使用它们(初始化它们除外)都会导致undefined behavior。取消引用未初始化的指针几乎是双重的。
答案 3 :(得分:1)
默认值是默认初始化分配的值,对于整数类型(如0
),它是char
,并且 nullpointer 用于任何指针类型。因此,您的代码在这里已经是错误的:
printf("\nValue of char ptr:%c\n", *cp);
因为不能取消引用 nullpointer ,所以它明确指出无处。取消引用它会导致未定义的行为。
但是,当您使用自动存储持续时间(函数范围中的默认设置)定义这些变量时,它们根本不会初始化,除非您自己进行初始化。因此,它们的初始值只是不确定的。这意味着您的第一行
printf("\nValue of char c:%c\n", c);
打印一些不确定值。这是否是未定义的行为,还取决于您的char
是默认签名还是未签名。签名的字符允许具有陷阱表示,因此您可以尝试在此处打印不是char
-> 未定义行为的有效表示的内容
取消引用某些“随机”指针也是未定义的行为(实际上,很可能会使程序崩溃)。
答案 4 :(得分:0)
首先,它们没有初始化!为变量分配值。
例如:
char c = 's', *cp = %c;
printf("\nValue of char c:%c\n", c);
printf("\nValue of char ptr:%c\n", *cp);