程序选择'\ 0'即使没有提到 - 澄清

Gau*_*rav 1 c++ arrays

所以,我可以预测这个程序会做什么:

int main()
{
   char d[] = {'h','e','l','l','o'};
   const char *c = d;
   std::cout << *c << std::endl;
   while ( *c ) {
      c = c + 1;
      std::cout << *c << std::endl;
      if ( *c == '\0' )
         std::cout << "Yes" << std::endl;
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

从我的理解,代码应该永远不会打印因为\0字符数组中没有d[],所以这个程序正在采摘的垃圾值是什么?我做了这个,同时应该无限次地运行.是对的吗?

das*_*ght 7

这个问题的正确答案是程序表现出未定义的行为,因为它超过了数组的末尾.

更改程序以使用字符串文字进行初始化会将行为更改为"始终打印"Yes":

char d[] = "hello";
Run Code Online (Sandbox Code Playgroud)

我做了这个,同时应该无限次地运行.

一旦发生未定义的行为,所有赌注都将被取消.但是,通常程序设法在内存中找到零字节,d[]然后打印"Yes",并退出循环.

  • @Gaurav在内存中找到零字节的可能性非常高,特别是考虑到存储小数字的多字节数字,16字节边界对齐的指针等等.这与未定义的行为无关,只是一个实际的观察. (2认同)