C++ C中指向字符的指针的默认值

C++ C中指向字符的指针的默认值,c++,c,pointers,C++,C,Pointers,让我们来看看这个变量 char*s 我知道如果它是在全局范围内声明的,它的值应该是0 如果它是在局部范围内声明的,那么它的值是未定义的(尽管它可能是0) 我在测试中遇到了一个问题,听起来像这样:“指针的值定义为什么?” char* s a) 空 b) 空字符串 c) 未定义 我真的很困惑我应该选择什么答案,因为如果它是在全局范围内声明的,那么它的值将是null(我猜)。如果它是在局部范围内声明的,未定义(虽然我尝试时它是零),并且当我尝试cout它时,没有打印任何内容(没有分段错误,为什么?)

让我们来看看这个变量
char*s

我知道如果它是在全局范围内声明的,它的值应该是0

如果它是在局部范围内声明的,那么它的值是未定义的(尽管它可能是0)

我在测试中遇到了一个问题,听起来像这样:“指针的值定义为什么?”

char* s
a) 空
b) 空字符串
c) 未定义


我真的很困惑我应该选择什么答案,因为如果它是在全局范围内声明的,那么它的值将是null(我猜)。如果它是在局部范围内声明的,未定义(虽然我尝试时它是零),并且当我尝试
cout
它时,没有打印任何内容(没有分段错误,为什么?),这意味着它是一个空字符串(或者
cout
太棒了吗?)。

您引用的问题很可能是由一个不完全理解该问题的人写的。正如您正确指出的,此类指针的初始值在很大程度上取决于上下文:它的定义位置和定义方式(本地、静态、聚合成员?)。因此,正确的答案应该是解释这些依赖关系的扩展答案。试图以“多项选择,只是众多选择之一”的方式回答这样的问题是很奇怪的


当然,在非常普遍和最正式的迂腐的意义上,正确的答案是说“未定义”,因为在一般情况下,不知道定义在哪里,我们必须“假设最坏的情况”。但我怀疑测试的作者是否意识到了这一点。

在这种情况下,该值肯定是标准未定义的。不过,编译器通常会在调试模式下默认将其初始化为零。 当你打印出来时,cout不会进行任何成像,它会找到一个0,它不会打印任何东西

以下是默认初始化的规则:

  • 在没有初始值设定项的情况下声明具有自动、静态或线程本地存储持续时间的变量时
  • 由不带初始值设定项的新表达式创建具有动态存储持续时间的对象时
  • 当构造函数初始值设定项列表中没有提到基类或非静态数据成员,并且调用了该构造函数时
  • 例如:

    #include <string>
    struct T1 {};
    class T2 { 
        int mem;
     public:
        T2() {} // "mem" not in initializer list
    };
    int n; // This is not default-initialization, the value is zero.
    int main()
    {
        int n;            // non-class: the value is undeterminate
        std::string s;    // calls default ctor, the value is "" (empty string)
        std::string a[2]; // calls default ctor, creates two empty strings
    //    int& r;         // error: default-initializing a reference
    //    const int n;    // error: const non-class type
    //    const T1 nd;    // error: const class type with implicit ctor
        T1 t1; // ok, calls implicit default ctor
        const T2 t2; // ok, calls the user-provided default ctor 
                     // t2.mem is default-initialized (to indeterminate value)
    }
    
    #包括
    结构T1{};
    类T2{
    int-mem;
    公众:
    T2(){}//“mem”不在初始值设定项列表中
    };
    int n;//这不是默认初始化,值为零。
    int main()
    {
    int n;//非类:值未确定
    std::string s;//调用默认的ctor,值为“”(空字符串)
    std::string a[2];//调用默认的构造函数,创建两个空字符串
    //int&r;//错误:默认初始化引用
    //const int n;//错误:const非类类型
    //const T1 nd;//错误:具有隐式构造函数的const类类型
    T1;//确定,调用隐式默认构造函数
    const T2;//确定,调用用户提供的默认构造函数
    //t2.mem默认初始化(不确定值)
    }
    

    我想说-未定义(垃圾)-如果您在调试模式下编译,编译器将初始化指向
    NULL
    的指针,以打印您需要执行的指针值
    cout这是一个测试,您将有能力竞争分数吗?如果是这样,我会选择#1,因为争论“我假设这是一段完整的代码,显然变量不在函数内”比“我假设变量在函数内,即使代码不包含函数,也不告诉我有函数”要容易得多。这是一个愚蠢的问题,因为那里没有分号,因此可能存在一个
    =&n或a
    =malloc(20)之后,这将改变一切。但是,撇开这一点不谈,没有显式初始化的具有自动存储持续时间的指针的值是不确定的,不是未定义的,因此(c)是out。指针的值永远不能是“空字符串”,因此(b)为out。如果你愿意将“null”与“null pointer”等同起来,那么(a)可能是唯一正确的答案。此外,由于你明确询问了“C中指向
    char
    的指针的默认值”,然后提到你试图
    cout
    它,显然,
    s
    是在文件范围内定义的,在不同的翻译单元中有外部链接,所以你可以完全排除自动存储时间。作为一个学究,我想反驳“undefined”是最正式的学究式答案的说法,但我没有时间去解释这一点,所以我不打算争辩。