【问题标题】:what is the default value of char pointer or char variable [duplicate]char指针或char变量的默认值是什么[重复]
【发布时间】:2019-01-09 21:03:36
【问题描述】:

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

【问题讨论】:

  • 由于它们没有被初始化,它们可以是任何东西。
  • 这些值为“不确定”。 (具有 自动 存储类型的变量如果未初始化则具有不确定的值,并且在分配值之前处于替代状态)

标签: c++ c pointers char


【解决方案1】:

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

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

引用C11,第 6.7.9 章

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

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

  • 1234563未定义的行为。

【讨论】:

    【解决方案2】:

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

    您实际上是在使用此类未初始化的变量(尤其是通过取消引用指针)进入“未定义行为”的危险区域。

    【讨论】:

      【解决方案3】:

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

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

      在 C++ 中以任何方式使用它们,除了初始化它们会导致 undefined behavior。取消对未初始化指针的引用几乎是双倍的。

      【讨论】:

        【解决方案4】:

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

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

        因为 nullpointer 不能被取消引用,它明确地指向 nowhere。取消引用它会导致未定义的行为

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

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

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

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

        【讨论】:

          【解决方案5】:

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

          例如:

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

          【讨论】:

          • 将“o”分配给指针可能会使您的应用程序崩溃。 char *cp = &amp;c; 会更好。
          • @JimFell 你是对的,我有correctedmy 的答案
          猜你喜欢
          • 1970-01-01
          • 2023-03-08
          • 2021-09-05
          • 2018-04-05
          • 2016-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多