使用“ nullptr”,“ NULL”和“ 0”初始化指针会导致分段错误

时间:2020-07-07 18:55:59

标签: c++ pointers initialization

下面,我提供了三种不同的情况,其中代码吐出了“分段错误”,我不确定为什么!方案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 ++!

谢谢。

0 个答案:

没有答案