C++ C中指向字符的指针的默认值
让我们来看看这个变量C++ C中指向字符的指针的默认值,c++,c,pointers,C++,C,Pointers,让我们来看看这个变量 char*s 我知道如果它是在全局范围内声明的,它的值应该是0 如果它是在局部范围内声明的,那么它的值是未定义的(尽管它可能是0) 我在测试中遇到了一个问题,听起来像这样:“指针的值定义为什么?” char* s a) 空 b) 空字符串 c) 未定义 我真的很困惑我应该选择什么答案,因为如果它是在全局范围内声明的,那么它的值将是null(我猜)。如果它是在局部范围内声明的,未定义(虽然我尝试时它是零),并且当我尝试cout它时,没有打印任何内容(没有分段错误,为什么?)
char*s
我知道如果它是在全局范围内声明的,它的值应该是0
如果它是在局部范围内声明的,那么它的值是未定义的(尽管它可能是0)
我在测试中遇到了一个问题,听起来像这样:“指针的值定义为什么?”
char* s
a) 空b) 空字符串
c) 未定义
我真的很困惑我应该选择什么答案,因为如果它是在全局范围内声明的,那么它的值将是null(我猜)。如果它是在局部范围内声明的,未定义(虽然我尝试时它是零),并且当我尝试
cout
它时,没有打印任何内容(没有分段错误,为什么?),这意味着它是一个空字符串(或者cout
太棒了吗?)。您引用的问题很可能是由一个不完全理解该问题的人写的。正如您正确指出的,此类指针的初始值在很大程度上取决于上下文:它的定义位置和定义方式(本地、静态、聚合成员?)。因此,正确的答案应该是解释这些依赖关系的扩展答案。试图以“多项选择,只是众多选择之一”的方式回答这样的问题是很奇怪的
当然,在非常普遍和最正式的迂腐的意义上,正确的答案是说“未定义”,因为在一般情况下,不知道定义在哪里,我们必须“假设最坏的情况”。但我怀疑测试的作者是否意识到了这一点。在这种情况下,该值肯定是标准未定义的。不过,编译器通常会在调试模式下默认将其初始化为零。 当你打印出来时,cout不会进行任何成像,它会找到一个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)
}
#包括
结构T1{};
类T2{
int-mem;
公众:
T2(){}//“mem”不在初始值设定项列表中
};
int n;//这不是默认初始化,值为零。
int main()
{
int n;//非类:值未确定
std::string s;//调用默认的ctor,值为“”(空字符串)
std::string a[2];//调用默认的构造函数,创建两个空字符串
//int&r;//错误:默认初始化引用
//const int n;//错误:const非类类型
//const T1 nd;//错误:具有隐式构造函数的const类类型
T1;//确定,调用隐式默认构造函数
const T2;//确定,调用用户提供的默认构造函数
//t2.mem默认初始化(不确定值)
}
我想说-未定义(垃圾)-如果您在调试模式下编译,编译器将初始化指向
NULL
的指针,以打印您需要执行的指针值cout这是一个测试,您将有能力竞争分数吗?如果是这样,我会选择#1,因为争论“我假设这是一段完整的代码,显然变量不在函数内”比“我假设变量在函数内,即使代码不包含函数,也不告诉我有函数”要容易得多。这是一个愚蠢的问题,因为那里没有分号,因此可能存在一个=&n代码>或a=malloc(20)代码>之后,这将改变一切。但是,撇开这一点不谈,没有显式初始化的具有自动存储持续时间的指针的值是不确定的,不是未定义的,因此(c)是out。指针的值永远不能是“空字符串”,因此(b)为out。如果你愿意将“null”与“null pointer”等同起来,那么(a)可能是唯一正确的答案。此外,由于你明确询问了“C中指向char
的指针的默认值”,然后提到你试图cout
它,显然,s
是在文件范围内定义的,在不同的翻译单元中有外部链接,所以你可以完全排除自动存储时间。作为一个学究,我想反驳“undefined”是最正式的学究式答案的说法,但我没有时间去解释这一点,所以我不打算争辩。