我愿意为这个问题失去一些声誉,因为我不明白为什么我的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;
}
答案 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
)*pointer = new int()
)答案 2 :(得分:2)
noPointer = &no_one; // You are initializing the noPointer with an accessible address which is necessary.
如果你没有初始化指针变量,它指向一个可能或不可访问的地址。所以你必须初始化指针变量
答案 3 :(得分:2)
您的pointer
变量具有不可预测的值(您没有设置它,因此它可以获取堆栈中的任何内容),因此指向某个随机内存位置。然后尝试为该随机存储器分配一些东西,可能导致分段错误。
这里的道德是始终使用&
运算符的结果或使用new
的显式分配来初始化您的指针。