繁体   English   中英

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

[英]C++ Pointers - Syntax and Failing Program

我愿意为此问题失去一些声誉,因为我不明白为什么我的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;
}

指针指向内存,但不“拥有”内存。 更糟糕的是,如果未初始化,它将指向null或nomansland中的某个位置。

混乱之处在于可以为int * pointer分配任何值。 可以在整个系统上加载任何地址。 但是,并非每个地址都是阅读或写作的有效场所。 0是完美的例子。

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

尽管编译器可以很好地进行编译,但是运行以下代码通常会导致失败:

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

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

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

int *pointer;

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

*pointer = 23

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

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

  • 对现有变量的引用(例如您的示例: pointer = &intVariable
  • 动态分配(例如int *pointer = new int()
noPointer = &no_one; // You are initializing the noPointer with an accessible address which is necessary.

如果不初始化指针变量,则它指向可能无法访问的某个地址。 所以你必须初始化指针变量

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM