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

时间:2013-06-29 16:09:04

标签: 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;
}

根据我的理解*((*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;
}

当我将a替换为*a时,为什么会出错?

1 个答案:

答案 0 :(得分:11)

您可以在

中访问未初始化的指针
*a=b;

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


第二个变体有效,因为你将a指向b,你没有写入未初始化的指针,你实际上初始化指针的位置b中的第一项。