C ++指针 - 语法和失败程序

时间:2013-12-23 03:46:01

标签: c++ pointers

我愿意为这个问题失去一些声誉,因为我不明白为什么我的C ++程序无效。我正在学习C ++指针,我有点接受这个概念,但是我无法应用语法。 我认为评论代码的行是失败的,因为我试图访问内存中的无效位置,但我在哪里错了?未注释的行工作

程序

#include <iostream>

using namespace std;

int main()
{
  /*  int * pointer;  // These commented lines don't work
    *pointer = 23;
    cout << "Pointer: " << pointer
         << "\n*Pointer: " << *pointer
         << "\n&Pointer: " << &pointer; */

  int *noPointer;
  int no_one = 1;
  noPointer = &no_one; //taking this line out gives a warning, but doesn't hurt program
  *noPointer = 10;

  cout << noPointer << " " << *noPointer;
    return 0;
}

4 个答案:

答案 0 :(得分:4)

指针指向内存,但不“拥有”内存。更糟糕的是,如果没有初始化,它指向null或在nomansland的某个地方。

令人困惑的是,int * pointer可以分配任何值。它可以在整个系统中加载任何地址。但并非每个地址都是阅读或写作的有效地方。 0是一个完美的例子。

因此,在将其指向有效位置之前,先取int * pointer然后为其分配内容,只需在随机未分配的内存中填充值。

虽然编译器可以很好地编译它,但运行这段代码通常会导致失败:

int * pointer = 0 ;
int badval = * pointer ;  // what exists at address zero?

* pointer= 100 ;  // write 100 to address zero, probably really bad.

指针需要指向自动分配的内容,或者通过new或其他系统分配器为其分配内存。

答案 1 :(得分:3)

int *pointer;

这声明了一个指向int的指针。该变量是本地的,因此它可以在堆栈上自动分配。发生的变化是变量包含的值(地址)包含垃圾值,因为您没有使用任何有效的内存地址进行初始化。

*pointer = 23

您取消引用指针,因此您尝试设置此地址指向的值,但您从未将指针初始化为有效地址,因此您尝试在垃圾记忆地址中写入23,这会使您的程序崩溃。

为了能够修改指向值,您需要通过以下方式获取其地址:

  • 对现有变量的引用(如示例中所示:pointer = &intVariable
  • 动态分配(例如int *pointer = new int()

答案 2 :(得分:2)

noPointer = &no_one; // You are initializing the noPointer with an accessible address which is necessary.

如果你没有初始化指针变量,它指向一个可能或不可访问的地址。所以你必须初始化指针变量

答案 3 :(得分:2)

您的pointer变量具有不可预测的值(您没有设置它,因此它可以获取堆栈中的任何内容),因此指向某个随机内存位置。然后尝试为该随机存储器分配一些东西,可能导致分段错误。 这里的道德是始终使用&运算符的结果或使用new的显式分配来初始化您的指针。