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

C++ 为什么我的代码会产生分段错误?,c++,pointers,C++,Pointers,当我将a替换为*a时,为什么会出现错误?您在 #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
替换为
*a
时,为什么会出现错误?

您在

#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
指向
b
时,您不会写入未初始化的指针,而是使用
b

中第一项的位置初始化指针,然后在
b

中访问未初始化的指针

#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
指向
b
,则不会写入未初始化的指针,实际上,您使用
b

中第一项的位置初始化指针。您没有为
a
分配任何内存。您正在将指向int的指针分配给
a
,这是指向
指向int的指针。所以你必须为指向int的指针分配内存。这样看:
int*a
可以被看作是
(no_adr_ptr)a
,当你这样做
a=b时,它会变成
(adr_of_b)a
int**a
变为
(无adr\u ptr(无adr\u ptr)a)
当您执行
*a=b
时,它变为
(无adr\u ptr(无adr\u of b)a)
。hthy您没有为
a
分配任何内存。您正在将指向int的指针分配给
a
,这是指向
指向int的指针。所以你必须为指向int的指针分配内存。这样看:
int*a
可以被看作是
(no_adr_ptr)a
,当你这样做
a=b时,它会变成
(adr_of_b)a
int**a
变为
(无adr\u ptr(无adr\u ptr)a)
当您执行
*a=b
时,它变为
(无adr\u ptr(无adr\u of b)a)
。汉克斯。你能给我一个在线参考资料,让我可以完全阅读和理解吗?@Alex抱歉,但不幸的是,我不知道任何好的指针教程。Stroustrup。第1页到1600页左右。谢谢。你能给我一个在线参考资料,让我可以完全阅读和理解吗?@Alex抱歉,但不幸的是,我不知道任何好的指针教程。Stroustrup。第1页至1600页左右。
*a=b;