【问题标题】:Default value for pointer to char in CC中指向char的指针的默认值
【发布时间】:2014-05-31 19:21:57
【问题描述】:

让我们有变量 char *s;

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

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

我在测试中有一个问题,听起来像这样“定义为

的指针的值是多少
char* s

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

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

【问题讨论】:

  • 我想说——未定义(垃圾)——如果你在调试模式下编译,编译器会初始化指向NULL的指针
  • 要打印指针值你需要做cout << (void *) s,否则它会尝试打印s指向的空终止字符串,这是你不想要的。但我认为你比写这个问题的人更了解这一点。
  • 这是一个你有能力竞争成绩的测试吗?如果是这样,我会选择#1,因为争论“我假设这是一段完整的代码,显然变量不在函数内部”比“我假设变量在函数内部,即使代码不包含函数,也不告诉我有函数”
  • 这是一个愚蠢的问题,因为那里没有分号,所以后面可能会有= &n;= malloc(20);,这会改变一切。但是,除此之外,具有自动存储持续时间且未显式初始化的指针的值是不确定的,不是未定义的,因此 (c) 不可用。指针的 value 永远不能是“空字符串”,所以 (b) 出局了。如果您愿意将“null”与“null pointer”等同起来,那么您将得到 (a),这可能是唯一正确的答案。
  • 此外,由于您明确询问“C中指向char的指针的默认值”,然后提到您正在尝试cout它,那么显然s已定义在文件范围内,在不同的翻译单元中具有外部链接,因此您可以完全排除自动存储持续时间。

标签: c++ c pointers


【解决方案1】:

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

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

【讨论】:

  • 作为一个学究,我想对“未定义”是最正式的学究答案的说法提出异议——但我没有时间知道这会导致什么,所以我不打算争论它。
【解决方案2】:

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

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

  1. 当声明具有自动、静态或线程本地存储持续时间的变量时没有初始化器
  2. 当具有动态存储持续时间的对象由不带初始化程序的 new 表达式创建时
  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)
}

Source

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 2011-04-24
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2018-04-05
    • 2021-08-11
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多