Segfault指针

时间:2013-12-16 00:18:43

标签: c++ segmentation-fault

我是C ++和指针的新手,下面写了一个简单的cpp。我继续得到一个段错误,但我不确定为什么。

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

5 个答案:

答案 0 :(得分:4)

您的整数指针为空。见这一行:

int *x =0

在该行上,您将整数指针的内存地址设置为零(即nullptr)。我希望你想做的是将值设置为零,在这种情况下你需要这样做:

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

答案 1 :(得分:3)

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

将计算机上的内存想象成一张方格纸。纸上的每个正方形都有一个地址,就是前面的正方形数。指针用于存储这些地址。 int是一个实际值,如'5 apples'或'12 downvoting asshats'。这些是通过在一个矩形内写入数字而存储的值。

然而,管理系统的操作系统知道人们犯的最常见的错误之一就是忘记正确设置指针并尝试在方格纸的最开头写数字,所以它设计了图形如果你尝试在前几个方框中的任何一个中写一个数字,那么纸会给你一个电击。这是您的分段错误。

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

int i;
int * x = &i;

在堆栈上声明某些内容意味着内存将在离开作用域时自动释放,即函数结束。

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

int * x = new int;

这意味着您个人有责任确保您稍后释放内存。

delete x;

否则你会造成内存泄漏。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

int *x = 0; 

你创建了一个名为x的int指针,它指向位置0的内存。

*x = 8; 

您尝试将值8写入位置0的内存中,该值存储在x中。由于此内存不归您所有,操作系统会终止您。

答案 4 :(得分:1)

让我们稍微分解一下:

int *x = 0

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

*x = 8

一旦你“取消引用”x,就会立即出现问题,这意味着要求x指向的空格。

因为你将x指向NULL,所以你要求int位于NULL。这是非法的,因为NULL是导致seg-fault的无效内存空间。