价值寿命 >我对代码< >代码> 数组的生存期感到困惑,如果语句,它是否仍然存在于?我们在C和C++中得到了相同的答案吗? int main (int argc, char* argv[]) { char* host; if (1 == argc) { /*code below is copied from a book*/ char myname[256]; gethostname(myname, 255); host = myname; /*code above is copied from a book*/ } else { /* */ } printf("%s\n",host); return 0; } 编辑:

价值寿命 >我对代码< >代码> 数组的生存期感到困惑,如果语句,它是否仍然存在于?我们在C和C++中得到了相同的答案吗? int main (int argc, char* argv[]) { char* host; if (1 == argc) { /*code below is copied from a book*/ char myname[256]; gethostname(myname, 255); host = myname; /*code above is copied from a book*/ } else { /* */ } printf("%s\n",host); return 0; } 编辑:,c++,c,C++,C,代码片段来自《Linux编程入门》第四版第15章:套接字 ,我很抱歉作者犯了这样的错误。但我认为这本书很好,排除了这段代码 myname数组的生存期[;]是否在if语句之外仍然有效 否 Do we get the same answer in C and C++? 是 它是丑陋的、不好的代码,并且有UB,使用std::string作为host如果,则myname数组在末尾被销毁。此时打印主机可能会正常工作,但这是未定义的行为,因为您使用的是指向已销毁的内存的指针。其功能取决于实施(和其他因素)

代码片段来自《Linux编程入门》第四版第15章:套接字 ,我很抱歉作者犯了这样的错误。但我认为这本书很好,排除了这段代码

myname
数组的生存期[;]是否在if语句之外仍然有效

Do we get the same answer in C and C++?


它是丑陋的、不好的代码,并且有UB,使用
std::string
作为
host
如果
,则
myname
数组在
末尾被销毁。此时打印
主机
可能会正常工作,但这是未定义的行为,因为您使用的是指向已销毁的内存的指针。其功能取决于实施(和其他因素)


在C和C++中它是相同的(已销毁=>未定义)

一旦您离开
块,如果
myname[256]
没有保证。编译器中没有任何东西可以跟踪
host
指向
myname
的事实,以便“保持它的活动状态”。

@史前企鹅:代码有未定义的行为,这是不好的,不是依赖于实现,而是依赖于随机条件和突发奇想。换句话说,完全不可预测。@Potatoswatter非常正确,我在之前关于这个话题的回答中提到月亮的相位有着重要的影响。。但我希望实现也能在其中发挥作用,是吗?代码来自一本书?烧掉它!:)如果(1==argc)
但不要忘记堆栈,请您采纳以下内容:
if(1==argc)
@史前企鹅-请继续。在LHS上使用常量,从长远来看,这会让你省去很多心痛。特别是当你忘记了双精度=@EdHeal时,我更愿意将警告级别调高。缩进不会出错!