C语言中字符指针的默认值

9

让我们来看一下变量char *s;

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

如果它在本地范围内声明,它的值是未定义的(尽管它可能是0)。

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

char* s

a) null
b) 空字符串
c) undefined

我非常困惑应该选择哪个答案,因为如果它在全局作用域中声明,那么值将为null(我猜)。如果它在局部作用域中声明,则为undefined(尽管当我尝试时为零),并且当我尝试使用cout时,没有任何内容被打印出来(没有分段错误,为什么?),这意味着它是一个空字符串(或者是cout太棒了?)。


3
如果您以调试模式编译,我会说-未定义(垃圾)-编译器将会将指针初始化为NULL - NirMH
2
要打印指针值,您需要执行 cout << (void *) s,否则它将尝试打印 s 指向的以空字符结尾的字符串,这是您不想要的。但我认为您比提出问题的人更理解这一点。 - Alan Stokes
1
这个问题有点愚蠢,因为那里没有分号,所以可能是=&n;或者= malloc(20);,这将改变一切。但是,抛开这个不说,具有自动存储期限且未被明确初始化的指针的值是不确定的,而不是未定义的,所以(c)不符合要求。指针的永远不可能是“空字符串”,所以(b)也不对。只剩下(a)了,只有它才能是唯一正确的答案,前提是你愿意将"null"等同于"空指针"。 - Crowman
此外,既然您明确询问C语言中指向char的指针的“默认值”,并且提到正在尝试使用cout输出它,则显然s是在不同的翻译单元中以外部链接方式定义的文件作用域变量,因此您可以完全排除自动存储期。 - Crowman
你的标题写着“在C中”,但是接下来你谈论的是cout。除非你想要对cout进行左移操作,也许应该将标题改为“C++”,并且去掉“C”标签。 - M.M
显示剩余2条评论
2个回答

20

引用的问题很可能是由一个并没有完全了解该问题的人编写的。正如你正确指出的那样,这种指针的初始值在很大程度上取决于上下文:它是在哪里以及如何定义的(局部变量、静态变量、聚合成员等?)。 因此,正确的答案应该是一个扩展的答案,以解释这些依赖关系。试图用“多项选择,仅限一个”的方式回答这样的问题是奇怪的。

当然,在非常普遍和形式上最严谨的意义上,正确的答案是那个说“未定义”的答案,因为在一般情况下,不知道它在哪里定义,我们必须“假定最坏的情况”。 但我怀疑问题的作者意识到了这一点。


作为一个学究,我想就“未定义”是最正式的学究回答提出质疑,但我没有时间去争论这个问题。 - user2357112

0

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

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

  1. 当具有自动、静态或线程本地存储期的变量声明没有初始化程序时
  2. 通过new-expression创建具有动态存储期的对象而没有初始化程序时
  3. 当基类或非静态数据成员未在构造函数初始化程序列表中提及并且调用了该构造函数时。

例如:

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

源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接