C++ 数组后面的内存位置值是否始终为0?

C++ 数组后面的内存位置值是否始终为0?,c++,arrays,C++,Arrays,我看到了比亚恩·斯特劳斯图普第四版的一个例子,如下所示: char *p = "asdf"; for (; *p != 0; ++p) cout << "char: " << *p << endl; char*p=“asdf”; 对于(;*p!=0;++p) 库特 数组后面的内存位置值是否始终为0 否。访问该内存会产生未定义的行为;它可能不可访问,并且您从中获得的任何值都是垃圾 但是,类似于“asdf”的字符串文字表示在末尾具有零值字符的数组,以及文

我看到了比亚恩·斯特劳斯图普第四版的一个例子,如下所示:

char *p = "asdf";
for (; *p != 0; ++p)
    cout << "char: " << *p << endl;
char*p=“asdf”;
对于(;*p!=0;++p)
库特
数组后面的内存位置值是否始终为0

否。访问该内存会产生未定义的行为;它可能不可访问,并且您从中获得的任何值都是垃圾

但是,类似于
“asdf”
的字符串文字表示在末尾具有零值字符的数组,以及文字指定的字符;这就是为什么这个例子,以及通常的C风格字符串争论,可以处理字符串文本


注意,在现代C++中,你需要<代码> const char */c>而不是<代码> char */COD>,因为字符串文字表示常量数组。

一般不是,但在这种特定情况下:是。

char *p = "asdf";
为字符串文本“asdf”创建一个以零结尾的
char*
。所以上面的代码是安全的

这与例如

int arr[] = {1,2,3,4};
int *p = arr;
for (; *p != 0; ++p)
    cout << "int: " << *p << endl;
intarr[]={1,2,3,4};
int*p=arr;
对于(;*p!=0;++p)

coutp是指向C样式字符串的指针。编译器会自动添加一个额外字符,并将其设置为0,null

之所以使用null,是因为它不会自然出现在字符串中,因此可以用作sentinel值,以便在到达字符串末尾时知道


这是唯一出现这种额外空值的情况,但编译器通常会执行类似这样的小技巧,以便在执行常见和平凡任务时更轻松。称之为语法糖,编译器为您提供的一个小助手,使您的生活更轻松。另一个例子是自动生成的琐碎构造函数和析构函数。< /P>这可能不是书中的一个例子,因为它甚至不是有效的C++。@ KeRekSb const char在旁边,为什么它甚至不有效?它在C++ 03中有效,而不是C++。11@EricAppelt:在C++11或更高版本中无效。你会得到警告而不是错误,因为你将它编译为一种过时的方言。@MikeSeymour我想回答Stroustrup的书早于C++11x,所以它在上下文中是有效的,但是第四版被宣传为“广泛重写以呈现C++11语言”,所以你是对的。如果数组以零结尾,在查找数组的结尾时,取消对该零的引用应该是分段错误,对吗?为什么不呢?@Neo 0仍然是数组的一部分。文本
“Hi”
类似于
const char[]={'H','i','\0'}
。你不能越界。