C++ 结构属性可以在函数内改变,但在函数范围外保持不变
C++ Struct attributes can change within function, but remain unchanged outside scope of function
我正在应对一项自我挑战,其中涉及实现一个 linked 列表和一个追加函数,这给我带来了看似与变量范围相关的问题。
append 函数循环遍历每个 link 元素,直到它读取一个 NULL
值,然后将与该 link 关联的数据值更改为函数输入。函数内的测试输出似乎表明它正在按预期工作,但是在函数外执行相同的测试时,即使在调用它之后也会给出不同的输出。
template <class T>
struct atom{
T data;
atom<T>* link = NULL;
};
template <class T>
void append_LL(atom<T> first, T input_data){
atom<T>* current_node = &first;
atom<T>* next_node = current_node->link;
int i = 0;
while (i < 4 && next_node != NULL) {
current_node = next_node;
next_node = next_node->link;
i ++;
}
current_node->data = input_data;
current_node->link = (atom<T>*)malloc(sizeof(atom<T>));
cout << "leaving node as: " << current_node->data << endl; //outputs 5
cout << "input nodes data: " << first.data << endl; //outputs 5
}
int main() {
int dd = 5;
atom<int> linked_list;
linked_list.data = 999;
append_LL(linked_list, dd);
cout << linked_list.data << endl; //outputs 999
}
因为你发送的不是同一个atom
。您会看到程序正在 main
函数中复制 linked_list
并将该副本发送给函数。
如果要修改一样linked_list
那就改
void append_LL(atom<T> first, T input_data){
到
void append_LL(atom<T> &first, T input_data){
这样您发送的是真正的 atom
而不是它的副本。
我正在应对一项自我挑战,其中涉及实现一个 linked 列表和一个追加函数,这给我带来了看似与变量范围相关的问题。
append 函数循环遍历每个 link 元素,直到它读取一个 NULL
值,然后将与该 link 关联的数据值更改为函数输入。函数内的测试输出似乎表明它正在按预期工作,但是在函数外执行相同的测试时,即使在调用它之后也会给出不同的输出。
template <class T>
struct atom{
T data;
atom<T>* link = NULL;
};
template <class T>
void append_LL(atom<T> first, T input_data){
atom<T>* current_node = &first;
atom<T>* next_node = current_node->link;
int i = 0;
while (i < 4 && next_node != NULL) {
current_node = next_node;
next_node = next_node->link;
i ++;
}
current_node->data = input_data;
current_node->link = (atom<T>*)malloc(sizeof(atom<T>));
cout << "leaving node as: " << current_node->data << endl; //outputs 5
cout << "input nodes data: " << first.data << endl; //outputs 5
}
int main() {
int dd = 5;
atom<int> linked_list;
linked_list.data = 999;
append_LL(linked_list, dd);
cout << linked_list.data << endl; //outputs 999
}
因为你发送的不是同一个atom
。您会看到程序正在 main
函数中复制 linked_list
并将该副本发送给函数。
如果要修改一样linked_list
那就改
void append_LL(atom<T> first, T input_data){
到
void append_LL(atom<T> &first, T input_data){
这样您发送的是真正的 atom
而不是它的副本。