下面,我提供了三种不同的情况,其中代码吐出了“分段错误”,我不确定为什么!方案1仅执行第一行(This is i: 42
),然后由于分段错误消息而崩溃。在场景2中,我只声明了指针(但没有初始化它们),代码可以工作到std::cout << "This is *pi3: " << *pi3 << std::endl;
(它不执行此行,其余行)。最后,在场景3中,即使我只添加了int j = 5;
,它仍然只执行第一行(即“ This is i:42”)!
方案1:
#include <iostream>
#include <cstdlib>
int main(){
int i = 42;
int *pi = nullptr;
int *pi2 = &i ;
int *pi3 = nullptr;
std::cout << "This is i: " << i << std::endl;
std::cout << "This is *pi: " << *pi << std::endl;
std::cout << "This is pi: " << pi << std::endl;
std::cout << "This is *pi2: " << *pi2 << std::endl;
std::cout << "This is pi2: " << pi2 << std::endl;
std::cout << "This is *pi3: " << *pi3 << std::endl;
std::cout << "This is pi3: " << pi3 << std::endl;
pi3 = pi2;
std::cout << "This is *pi3: " << *pi3 << std::endl;
std::cout << "This is pi3: " << pi3 << std::endl;
return 0;
}
方案2:
#include <iostream>
#include <cstdlib>
int main(){
int i = 42;
int *pi ;
int *pi2 = &i;
int *pi3 ;
std::cout << "This is i: " << i << std::endl;
std::cout << "This is *pi: " << *pi << std::endl;
std::cout << "This is pi: " << pi << std::endl;
std::cout << "This is *pi2: " << *pi2 << std::endl;
std::cout << "This is pi2: " << pi2 << std::endl;
std::cout << "This is *pi3: " << *pi3 << std::endl;
std::cout << "This is pi3: " << pi3 << std::endl;
pi3 = pi2;
std::cout << "This is *pi3: " << *pi3 << std::endl;
std::cout << "This is pi3: " << pi3 << std::endl;
return 0;
}
场景3(我仅添加int j = 5;
):
#include <iostream>
#include <cstdlib>
int main(){
int i = 42;
int j = 5 ;
int *pi ;
int *pi2 = &i;
int *pi3 ;
std::cout << "This is i: " << i << std::endl;
std::cout << "This is *pi: " << *pi << std::endl;
std::cout << "This is pi: " << pi << std::endl;
std::cout << "This is *pi2: " << *pi2 << std::endl;
std::cout << "This is pi2: " << pi2 << std::endl;
std::cout << "This is *pi3: " << *pi3 << std::endl;
std::cout << "This is pi3: " << pi3 << std::endl;
pi3 = pi2;
std::cout << "This is *pi3: " << *pi3 << std::endl;
std::cout << "This is pi3: " << pi3 << std::endl;
return 0;
}
我了解初始化指针(以及更大程度地扩展所有变量)是一种好习惯。那么,为什么它在这里不起作用?当我不初始化场景2中的* pi和* pi3时,为什么它只在代码中途起作用?如果您能向我解释每种情况下发生的事情以及错误的根源,我将不胜感激。我在2019年的MacBook Pro上同时使用了g ++和clang ++!
谢谢。