分段故障指针 我是C++和指针的新手,下面写了一个简单的CPP。我一直有seg故障,但我不知道为什么 int main() { int *x = 0; *x = 8; return 0; }

分段故障指针 我是C++和指针的新手,下面写了一个简单的CPP。我一直有seg故障,但我不知道为什么 int main() { int *x = 0; *x = 8; return 0; },c++,segmentation-fault,C++,Segmentation Fault,整数指针为空。请看这一行: int *x =0 在这一行中,您将整数指针的内存地址设置为零(即nullptr)。我希望您要做的是将值设置为零,在这种情况下,您需要执行以下操作: int main() { int *x = new int(0); *x = 8; return 0; } 当您定义int*x=0时,您告诉编译器的是“创建一个整数指针x,并设置它指向0(NULL)的位置”。您需要做的是动态创建一个新指针。这可以通过执行int*x=newint然后您可以更改其值。使用后,

整数指针为空。请看这一行:

int *x =0
在这一行中,您将整数指针的内存地址设置为零(即nullptr)。我希望您要做的是将值设置为零,在这种情况下,您需要执行以下操作:

int main() {
  int *x = new int(0);
  *x = 8;
  return 0;
}

当您定义
int*x=0
时,您告诉编译器的是“创建一个整数指针x,并设置它指向0(NULL)的位置”。您需要做的是动态创建一个新指针。这可以通过执行
int*x=newint然后您可以更改其值。使用后,应使用
delete x删除以释放其内存。

您已声明指向整数的指针并将其设置为0。实际上,您没有在任何地方分配整数。当您将8分配给取消引用的指针时,您正试图写入位置0处的内存。所有现代操作系统都会在地址0及其附近的任何位置读取和写入内存,以防止这种“空指针错误”

把计算机上的内存想象成一张图表纸。纸上的每个方块都有一个地址,地址是它前面的方块数。指针用于存储这些地址。一个
int
是一个实际值,比如“5个苹果”或“12个下注”。这些是通过在其中一个矩形中写入数字存储的值

然而,管理该系统的操作系统知道,人们最常见的一种错误是忘记正确设置指针,并试图在图形纸的最开始处写入数字,因此设计图形纸的目的是,如果您试图在前几个框中的任何一个框中写入数字,都会给您带来电击。这是你的错

要解决此问题,可以在堆栈上声明一个整数

int i;
int * x = &i;
在堆栈上声明某些内容意味着当内存离开作用域时,即函数结束时,将自动释放内存

另一方面,您可以在堆上分配指针

int * x = new int;
这意味着您个人有责任确保在以后某个时候释放内存

delete x;
否则会造成内存泄漏

int *x = 0; 
您创建了一个名为
x
的int指针,它指向位置0处的内存

*x = 8; 

您试图将值8写入存储在
x
中的位置0的内存中。由于此内存不属于您,因此操作系统终止了您的使用。

让我们将其分解一下:

int *x = 0
此行创建一个名为x的指针,并将其指向NULL(或无处)

一旦你“取消引用”x,这里就有一个直接的问题,这意味着要求与x指向的空间相关联


因为你把x指向NULL,所以你要求的是位于NULL的int。这是非法的,因为NULL是一个导致seg故障的无效内存空间。

内存中存储的
8
在哪里?然后结束投票应列为“重复”而不是“离题”,并且应该有注释指向问题的规范版本。混合指针和指向的类型是一个常见的问题,而不是一个完整的编程主题。当然,问题的标题可能会更好,但要做到这一点,需要事先了解答案。提问者不仅提供了一个清晰简洁的问题,而且提供了最少的可重复代码。@Jherico“指针”是一个完整的主题,确实如此。如果对某人来说,乍一看不清楚为什么
int*x=0*x=8本质上是完全错误的,那么这个人需要学习指针。这不仅是一个“常见问题”,而且表明OP根本不知道指针。这就是为什么他应该去他当地的图书馆拿K&R C,而不是浪费我们的时间。如果你能找到一个副本,请把它贴出来,这样我们就可以引导用户找到正确的问题。@Jherico标题是什么将帮助谷歌未来的访问者。请花些时间写一个更清晰的标题,帮助大家。这样一来,如果它是重复的,就更容易发现重复的,如果它不是,就更容易声称它不是。此外,仅仅因为一个问题因为错误的原因而被关闭并不意味着它应该被重新打开。把它标记为关闭的正确原因,我们很乐意这样关闭。那么,根据定义,这是一个分段错误吗?很抱歉,我正在尝试熟悉术语以及错误的显示方式将因编译器和操作系统的不同而有所不同,但是是的,只要您尝试写入内存,就会出现分段错误,因为操作系统将位置0处的内存标记为不可访问。在Unix/Linux上,操作系统会立即停止出现分段错误的程序。
*x = 8