为什么我的代码会产生分段错误?

Ale*_*lex 1 c++ pointers

#include <iostream>
using namespace std;

int main ()
{
    int **a;
    int b[5] = {3,4,5,6,1};
    *a=b;
    cout << *((*a)+0) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解*((*a)+0)相当于(*a)[0].我错了吗?如何使上面的代码打印出数组的第一个元素?

为什么这段代码有效?

#include <iostream>
using namespace std;

int main ()
{
    int *a;
    int b[5] = {3,4,5,6,1};
    a=b;
    cout << *(a+0) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我随处更换a*a,为什么会出错?

Som*_*ude 11

您在中访问未初始化的指针

*a=b;
Run Code Online (Sandbox Code Playgroud)

此时指向a一个随机位置,并且具有未定义行为的规则也无法预测会发生什么.对你而言,它似乎是一个你无法写入的位置,因此你会崩溃.


第二种变体是有效的,因为你a指出b,你不写入未初始化的指针,你实际上初始化指针与第一项的位置b.

  • 斯特劳斯.第1至1600页左右. (3认同)