[英]accessing array with pointer giving an extra element
好的,这是一个非常基本的问题,但我坚持下去。 我无法弄清楚数组末尾的额外神秘值。 我只是试图遍历数组的基地址,简单明了。 但是每次执行时,数组末尾的垃圾值都保持不变
g ++编译器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;
}
编辑1:我知道,当while遇到数组中的0时,它将终止,或者如果未找到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.
我的问题是,虽然while仅在0中断,为什么会在0中断
每次arrayLength + 1吗? 还有这个偶数长度是什么?
数组不以任何特殊方式终止。 你所试图做的是不工作,因为while(*arr)
依赖于一个错误的假设:有一个0
的数组(结束元素定点 ),但你声明数组{3,2,4,1,5}
所以没有结束元素。
我认为您的误解来自以下事实:您没有意识到int*
只是一个内存地址,每当您将++arr
递增时,您基本上都是通过sizeof(int)
对其进行调整。 仅此而已,当您到达数组的末尾时,地址仅指向数组之后的任意值。
之所以得到额外的元素,是因为指针没有什么可告诉编译器指针指向多少元素的。 当你做
while(*(arr)){...}
while循环将继续运行,直到l *arr == 0
。 由于数组不包含0
因此它将继续经过数组的末尾,直到找到0
为止。 这是未定义的行为,因为您正在访问该指针不拥有的内存。
我认为与其他数据类型相比,char数组(c字符串)的工作方式可能令人困惑。 当你有
char arr[] = "something";
while(*(arr)){...}
这在数组的末尾结束,因为c字符串会自动将null终止符(0)添加到字符串的末尾。 这使您可以执行上述循环之类的操作,因为您知道null终止符将在那里,如果不存在则终止于您创建字符串的人。
数组在传递给函数时会衰减为指针 ,而该函数对数组的长度一无所知。
那while(*arr)
东西是不正确的。 仅当该指针指向的某个值为零时,它才会停止。 但是谁说零放在数组的末尾呢? 当您增加arr
,您可以轻松地超出数组的范围(该函数不知道其大小!),然后*arr
将为您提供当前存储在arr
指向的内存地址中的任何内容。
要遍历数组,请传递数组本身及其长度。 否则,它将反复迭代直到*arr
的值为零。
指针在C ++中不会以任何字符终止。 这仅适用于其他类型,例如char*
因为它以\\0
(0)终止。
您需要先对INT-Array进行计数,然后才能将它们传递到类似的内容中,例如,此处以Pointer结尾的5:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
void printarray(int * arr){
int *saved=arr;
while(*saved!=5)
{
cout<<*saved++<<" ";
}
*saved=0;
cout<<endl;
}
int main(){
int arr[] = { 3, 2, 4, 1, 5 };
printarray(arr); // prints now without ending 5.
return 0;
}
否则,您需要传递元素的计数器。 C ++无法知道您的指针指向多少元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.