确定一个非常基本的问题,但我坚持不懈。我无法弄清楚数组末尾的额外神秘值。我只是试图通过它的基地址遍历数组,简单明了。但是每次执行时,数组末尾的垃圾值都保持不变
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;
}
编辑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.
我的问题是,如果while只在0处突破,为什么它会在wh处中断 arrayLength + 1每次?这个奇怪的长度又是什么呢?
答案 0 :(得分:5)
数组不会以任何特殊方式终止。你要做的是不行,因为while(*arr)
依赖于错误的假设:数组末尾有一个0
元素(sentinel)但是你声明了数组一个{3,2,4,1,5}
所以没有结束元素。
我认为你的误解来自这样一个事实,即你没有明白int*
只是一个记忆地址,每当你按++arr
递增它时,你基本上都会调整它{{1} }}。没有更多,当你到达数组的末尾然后地址只是指向数组之后,无论那里有什么价值。
答案 1 :(得分:2)
你得到了额外的元素,因为没有关于指针告诉编译器指针指向多少元素的指针。当你这样做
while(*(arr)){...}
while循环将继续运行直到*arr == 0
。由于数组不包含0
,因此它将继续越过数组的末尾,直到它找到0
。这是未定义的行为,因为您正在使用该指针访问您不拥有的内存。
我认为你可能会混淆char数组(c-strings)与其他数据类型相比如何工作。当你有
char arr[] = "something";
while(*(arr)){...}
这结束于数组的末尾,因为c-strings会自动将一个空终止符(0)添加到字符串的末尾。这允许你做上面循环之类的事情,因为你知道null终止符将在那里,如果不是那么那就是你创建字符串的人。
答案 2 :(得分:1)
数组在传递给函数时会衰减为指针,并且此函数对数组的长度一无所知。
while(*arr)
内容不正确。只有当此指针指向的某个值为零时,它才会停止。但谁说零放在数组的末尾?当你增加arr
时,你可以很容易地超出数组的范围(函数不知道它的大小!),然后*arr
将为你提供存储的内容。内存地址arr
指向此刻。
迭代数组,传递数组本身及其长度。否则,这将反复迭代,直到*arr
的值为零。
答案 3 :(得分:0)
指针不会被任何字符在C ++中终止。
这适用于其他类型,例如char*
,因为它以\0
(0)终止。
INT-Array你需要先对Elements进行计数才能将它们传递给类似的东西,例如这里的指针结尾为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 ++无法知道指针指向的元素数量。