【发布时间】: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已定义在文件范围内,在不同的翻译单元中具有外部链接,因此您可以完全排除自动存储持续时间。