更改变量的函数,即使按值传递也是如此

Function changing a variable, even when passed by value?

本文关键字:按值传递 变量 改变 函数      更新时间:2023-10-16

这就是我所拥有的,它导致了一些非常奇怪的差异。

#include<iostream>
using namespace std;
void input_data(int data[], short size);
int main(){
short size;
int data[1000];
cout << "How many values would you like to store? ";
cin >> size;
while (size > 0){
cout << "Enter your " << size << " values:" << endl;
input_data(&data[1000], size);
cout << size << " values stored in array." << endl;
}
}
void input_data(int data[], short size)
{
     int i;
     for (i=0;i<size;i++){
         cin >> data[i];
     }
}

所以这段代码应该非常简单,但是每当我为 size 输入 3 以外的值时,cout << size << " values stored in array." << endl;行最终会说"0 存储在数组中的值"。

我不明白input_data如何改变size的值,因为我是按值传递,而不是按引用传递。

为什么会发生这种情况,更好的是,为什么它与数字 3 一起工作?

您正在覆盖堆栈。

首先,声明一个接受数组的函数:

void input_data(int data[], short size);

然后你打电话给它。 而不是像这样传递指向数组第一个元素的指针:

input_data(data, size);
input_data(&data[0], size);

您将一个指针传递给紧跟在数组之后的空间(其中包括许多内容,包括大小(:

input_data(&data[1000], size);

虽然 data&data[0] 参数本质上是相同的,但&data[1000]指向完全不同的东西 - 它指向数组中不存在的data[1000]地址,因为数组只有 1000 个元素(从 0 到 999(