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;