我搜索了这个问题,他们中的大多数都说了同样的事情。因为我们只在函数中传递数组地址,编译器不能通过查看地址来知道数组大小,他们说。我尝试使用这段代码来测试这一点,两个函数给出了相同的结果。那么,将数组大小指定为函数参数对我有什么帮助呢?在什么情况下,指定大小对我们有帮助?
class ArrayTest
{
public:
void say(int ar[])
{
cout<<ar[1]<<endl;
cout<<ar[7]<<endl;
}
void say(int ar[],int sizeAn)
{
cout<<ar[1]<<endl;
cout<<ar[7]<<endl;
}
};
int main()
{
ArrayTest test;
int anAr[5] = {1,2,3,4,5};
test.say(anAr);
test.say(anAr,5);
return 0;
}发布于 2018-10-30 17:50:58
这关系到你作为程序员是否有机会进行边界检查,而不是编译器是否能做到这一点。
只需尝试打印出数组中的所有元素,大小如下:
void say(int ar[],int sizeAn)
{
for(int i=0; i< sizeAn; ++i)
cout<<ar[i]<<endl;
}现在不考虑大小:
void say(int ar[])
{
for(int i=0; i< /*HOW DO I KNOW NOW?*/; ++i)
cout<<ar[i]<<endl;
}发布于 2018-10-30 17:50:35
请注意,您的代码调用了未定义的行为,因为您正在访问一个只有5个元素大小的数组的元素7。使用size参数,例如,您可以检查索引是否超过其大小,而不执行该调用。
在您的示例中,您将获得相同的结果,因为您实际上并没有使用参数:
void say(int ar[],int sizeAn)
{
cout<<ar[1]<<endl;
cout<<ar[7]<<endl;
}sizeAn是未使用的,所以它没有任何区别。但是考虑一下下面的代码:
void say(int ar[],int sizeAn)
{
for (int i = 0; i < sizeAn; i++){
cout<<ar[i]<<endl;
}
}在这里,它打印数组中的所有项,所以它需要知道数组有多大。例如,如果使用std::vector,则不需要传递大小,因为只需调用size函数,但不能使用C样式数组传递大小,因此如果您想要编写一个根据大小而表现不同的函数,则需要将该大小作为参数传递。
下面是一个更实际的代码示例,其中使用size参数来避免未定义的行为:
void say(int ar[],int sizeAn)
{
cout<<ar[1]<<endl;
if (sizeAn >= 8){
cout<<ar[7]<<endl;
}
}现在,它与您的代码一样,只是在元素7实际存在的情况下才打印它。
发布于 2018-10-30 17:50:40
正如您所说,如果将数组传递给函数,编译器无法判断数组有多大。您的第一个say函数尝试引用超过数组末尾的内容(ar7超出了5的大小)。你的第二个say函数意味着你可以检查长度,以确保你不会犯这个错误。
void say(int ar[], int sizeAn)
{
if(sizeAn>1)
cout<<ar[1];endl;
if(sizeAn>7)
cout<<ar[7];endl;
}这样,您就知道了长度,函数就可以在访问无效内存位置之前对其进行检查。
https://stackoverflow.com/questions/53061454
复制相似问题