Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+;中以非空结尾的字符数组+;_C++_Arrays_Loops_Pointers_Char - Fatal编程技术网

C++ c+;中以非空结尾的字符数组+;

C++ c+;中以非空结尾的字符数组+;,c++,arrays,loops,pointers,char,C++,Arrays,Loops,Pointers,Char,给定以下代码: #include<iostream> int main(){ char container[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'}; for(char* cptr = container; *cptr != 0; cptr++) std::cout << *cptr << std::endl; return 0; } #包括 int main(){ 字符容器[]={'a','b','

给定以下代码:

#include<iostream>
int main(){
  char container[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
  for(char* cptr = container; *cptr != 0; cptr++)
    std::cout << *cptr << std::endl;
  return 0;
}
#包括
int main(){
字符容器[]={'a','b','c','d','e','f','g'};
for(char*cptr=container;*cptr!=0;cptr++)

真的,这只是运气

恰好与
容器[7]
对应的内存区域为0,因此您很幸运


超出数组的边界是未定义的行为。在您的情况下,它恰好是您希望的行为,但您不能依赖它。

您正在运行调用未定义行为的数组末尾。一种可能的未定义行为是,它以一种看似合理的方式工作。在这种情况下,可能是什么发生的情况是,未定义的行为在数组中填充了零。

您正在引发未定义的行为。未定义的行为意味着“任何事情都可能发生”,这有时包括您希望发生的事情。这就是这里发生的情况


调用未定义行为的原因是因为您正在从未初始化的内存中读取,当您首先访问超过
容器末尾的元素时,您发布的代码有一个可怕的错误:
cptr!=0
应该是
*cptr!=0
。您应该检查给定位置的字符是否正确地址为空,而不是指针本身为空

其他答案和注释都是正确的。获得正确输出的唯一原因是容器数组的末尾恰好有一些零内存。将
容器
数组放入结构中将有助于消除编译器可能插入的额外填充:

#include<iostream>
int main(){
  struct {
    char container[7];
    char alphabet[27];
  } x = {
    {'a', 'b', 'c', 'd', 'e', 'f', 'g'},
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  };
  for(char* cptr = x.container; *cptr != 0; cptr++)
    std::cout << *cptr << std::endl;
  return 0;
}
#包括
int main(){
结构{
炭容器[7];
字符字母表[27];
}x={
{'a','b','c','d','e','f','g'},
“ABCDEFGHIJKLMNOPQRSTUVWXYZ”
};
for(char*cptr=x.container;*cptr!=0;cptr++)

std::cout它会导致分段错误根据环境的不同,容器后的内存可能会初始化为零,从而导致出现空终止符。但是这不能保证,因此可能会在不同的机器/不同的编译器设置/不同的任何东西上失败。未定义的行为iour,您无法预测代码在运行时的行为。@VladLazarenko有一些动态分析工具,如valgrind和electric fence,用于查找此类问题。此外,调试版本的堆分配器通常会将模式写入内存,以查找引用堆不当的问题。在这种情况下,堆栈内存就是这样你可能还需要其他东西。这就是为什么它被称为未定义行为。它可以格式化你的硬盘,点亮白宫的圣诞树,或者工作,。+但是
幸运
应该是
不幸运
;)这是值得的,不是最好的。@GrijeshChauhan-Heh。我没有说“好运”或“坏运气”。Sidhart-这是好运气“您的代码可以按您希望的方式工作!“如果/当你移动到任何其他系统时,你会得到一个没有出现在你的系统上的错误,因此很难找到它,这是一个坏运气。@sidharthsharma-将来你可以测试你发布的代码,以避免这样的打字错误。这至少会让试图运行你发布的代码的其他评论员感到困惑。”。