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

时间:2018-08-02 07:19:55

标签: c++ c pointers char

下面是我尝试打印默认值/ 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;
}

5 个答案:

答案 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);