2012-06-05 83 views
0

我正在尝试一些基本的指针操作,并有一个问题,我想澄清。这里是代码片段我指的是指针故障

int arr[3] = {0}; 
*(arr+0) = 12; 
*(arr+1) = 24; 
*(arr+2) = 74; 
*(arr+3) = 55; 
cout<<*(arr+3)<<"\t"<<(long)(arr+3)<<endl; 
//cout<<"Address of array arr : "<<arr<<endl; 
cout<<(long)(arr+0)<<"\t"<<(long)(arr+1)<<"\t"<<(long)(arr+2)<<endl;; 
for(int i=0;i<4;i++) 
    cout<<*(arr+i)<<"\t"<<i<<"\t"<<(long)(arr+i)<<endl; 
//*(arr+3) = 55; 
cout<<*(arr+3)<<endl<<endl; 

我的问题是: 当我尝试存取权限编曲+ 3外的for循环,我得到印刷所需的值55。但是当我尝试通过for循环访问它时,我得到了一些不同的值(在这种情况下为3)。在for循环之后,它将值打印为4.有人可以向我解释发生了什么?在此先感谢..

+1

你声明大小为3的数组,并为其分配4个值。 –

回答

2

您已创建一个大小为3的数组,并且您正尝试访问第4个元素。因此结果是不确定的。

由于您在堆栈中分配数组,第一次尝试写入第4个元素时,实际上是在为堆栈分配的空间之外进行写操作。在调试模式下,这将工作,但在发布您的程序可能会崩溃。

第二次读取第四个地方的值时,您正在读取值4.这很有意义,因为编译器已经在变量i的数组后面分配了堆栈空间,在循环执行完成后具有值4.

+0

谢谢@kgiannakakis。 – frodo

0

由于数组已被定义为3个元素,数据将按顺序存储,如12,24,74。当为第四个元素赋值55时,它将存储在内存中的其他位置,而不是顺序存储。第一次,Compiler正确地打印它,但它不能处理内存,因此它会打印垃圾值。