使用指针访问数组,提供额外的元素

Sou*_*ddy 0 c++ arrays pointers

好一个非常基本的问题,但我坚持下去.我无法弄清楚数组末尾的额外神秘值.我只是试图通过它的基地址遍历数组,简单明了.但是每次执行时,数组末尾的垃圾值都保持不变

g ++ complier 64位机器.

#include<iostream>
#include<bits/stdc++.h>

using namespace std;

void printarray(int * arr){
   while(*(arr)){ cout<<*arr<<" "; arr++; }
   cout<<endl; 
}

int main(){
   int arr[] = { 3,2,4,1,5 };
   printarray(arr); // prints 3,2,4,1,5,32765
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑1:我明白,只要遇到数组中的0,while就会终止,或者如果没有找到0就会疯狂.但我还是希望你们看一下下面的测试用例

3,2,0,4,1,5  // outputs 3,2
3,2,4,1,5,7,8,9 // outputs same array correctly
3,2,4,1,5,7,8,9,10 // outputs array+ 1 varying garbage at last

//observations, this method works for even sized arrays not containing              
//0, while for odd it emits an additional garbage value.
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果while只在0处断开,为什么
每次都会在arrayLength + 1 处断开?这甚至奇怪的长度是什么?

Jac*_*ack 5

数组不会以任何特殊方式终止.你想要做的是不工作,因为while(*arr)依赖于一个错误的假设:0在数组的末尾有一个元素(一个哨兵),但是你声明了数组,{3,2,4,1,5}所以没有结束元素.

我认为你的错误概念来自这样一个事实,即你没有得到一个int*只是一个内存地址的信息,无论你何时增加它,++arr你基本上都在调整它sizeof(int).没有更多,当你到达数组的末尾然后地址只是指向数组后,无论那里有什么价值.