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;

我的问题是:当我尝试在 for-loop 之外访问 arr+3 时,我得到了所需的值 55 打印。但是当我尝试通过 for 循环访问它时,我得到了一些不同的值(在这种情况下为 3)。在 for 循环之后,它将值打印为 4。有人可以向我解释发生了什么吗?提前致谢..

4

2 回答 2

2

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

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

第二次在第 4 位读取值时,您正在读取值 4。这是有道理的,因为编译器在变量 i 的数组之后分配了堆栈空间,在循环完成执行后将具有值 4 .

于 2012-06-05T06:27:15.993 回答
0

由于数组已定义为 3 个元素,因此数据将按顺序存储,如 12、24、74。当您为第 4 个元素分配 55 时,它会存储在内存中的其他位置,而不是按顺序存储。第一次,编译器正确打印它,但它无法处理内存,所以它打印垃圾值。

于 2012-06-05T06:29:57.323 回答