让我们拥有变量
char *s
;
我知道如果它在全球范围内宣布,其值应为0;
如果它在本地范围内声明,则其值未定义(但可能为0)。
我在测试中遇到了一个问题听起来像这样的问题'指针定义的值是什么
char* s
a)null
b)空字符串
c)未定义
我真的很困惑我应该选择什么答案,因为如果它在全球范围内宣布,那么,该值将为空(我猜)。如果它在本地范围内声明,未定义(虽然当我尝试它为零时),当我尝试cout
时,没有打印任何内容(没有分段错误,为什么?),意味着它是一个空字符串(或者cout
真棒吗?)。
答案 0 :(得分:20)
您引用的问题很可能是由一个不完全理解该问题的人撰写的。正如您所正确指出的,这种指针的初始值很大程度上取决于上下文:在何处以及如何定义它(本地,静态,聚合成员?)。因此,正确答案应该是一个解释这些依赖关系的扩展答案。试图以“多种选择,只有众多”方式回答这个问题是很奇怪的。
当然,在非常一般和最正式的迂腐意义上,正确的答案是说“未定义”的答案,因为在一般情况下,不知道它的定义在哪里,我们必须“假设最坏的”。但我怀疑测试的作者意识到了这一点。
答案 1 :(得分:0)
在这种情况下,标准值肯定是未定义的。但是,编译器通常会在调试模式下将其初始化为零。 当你打印出来时,cout没有做任何magig,它会找到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)
}