C中指向char的指针的默认值

时间:2014-05-31 19:21:57

标签: c++ c pointers

让我们拥有变量 char *s;

我知道如果它在全球范围内宣布,其值应为0;

如果它在本地范围内声明,则其值未定义(但可能为0)。

我在测试中遇到了一个问题听起来像这样的问题'指针定义的值是什么

char* s

a)null
 b)空字符串
 c)未定义

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

2 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:0)

在这种情况下,标准值肯定是未定义的。但是,编译器通常会在调试模式下将其初始化为零。 当你打印出来时,cout没有做任何magig,它会找到0并且它不会打印任何东西。

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

  1. 当声明具有自动,静态或线程局部存储持续时间的变量时,没有初始化程序
  2. 当具有动态存储持续时间的对象由没有初始化程序的new-expression创建时
  3. 在构造函数初始值设定项列表中未提及基类或非静态数据成员且调用该构造函数时。
  4. 例如:

    #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)
    }
    

    Source