我正在尝试一些基本的指针操作,并且有一个我想澄清的问题。这是我所指的代码片段
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;
我的问题是: 当我尝试在for循环外访问arr + 3时,我得到所需的值55打印。但是当我尝试通过for循环访问它时,我得到一些不同的值(在这种情况下为3)。在for循环之后,它将值打印为4.有人可以向我解释发生了什么吗?提前谢谢..
答案 0 :(得分:2)
您已经创建了一个大小为3的数组,并且您正在尝试访问第4个元素。结果因此未定义。
由于您在堆栈中分配数组,因此第一次尝试编写第4个元素时,实际上是在写入超出为堆栈分配的空间。在调试模式下,这将有效,但在发布中,您的程序可能会崩溃。
第二次读取第4位的值时,您正在读取值4.这是有道理的,因为编译器已经在变量i的数组之后分配了堆栈空间,这在循环执行完毕后会有价值4。
答案 1 :(得分:0)
由于数组已定义为3个元素,因此数据将按顺序存储,如12,24,74。为第4个元素指定55时,它将存储在内存中的其他位置,而不是按顺序存储。第一次,编译器正确打印它,但它无法处理内存,因此它打印垃圾值。