我有一个简单的交换函数,用于获取整数数组,并返回具有交换值的新数组。

int* Node::dataSwap(int *data, int n_index, int swap_index){

    printDatt(data);
    int *path = data;
    int swapped = data[n_index];
    int to_swap = data[swap_index];
    path[n_index] = to_swap;
    path[swap_index] = swapped;
    printDatt(data);

    return path;

}
但是,此功能正在更改对原始数据的引用。输出看起来像这样(打印与控制台应该相同的数据)。
0, 1, 2
 3, 4, 5
 6, 7, 8

0, 1, 2
 3, 4, 8
 6, 7, 5
为什么不更改“数据”时会更改它? “路径”是对“数据”的实际内存地址的引用吗?

最佳答案

参数data和局部变量path的类型为 int * 。您可以将其视为“指向int的指针”。
指针是保存内存地址的变量。仅此而已。由于设置了path = data,所以这两个指针相等。
在您看来,data是一个数组。但这不是dataSwap函数所看到的。对于函数dataSwap,其参数data只是一个指向int的指针。此int是数组的第一个元素。您使用data[n_index]访问了数组的元素;但这只是*(data + n_index)的同义词。
如何解决您的问题?
C语言方式:mallocmemcpy由于要返回一个新数组,因此应该返回一个新数组。为此,您应该使用malloc分配新的内存区域,然后使用memcpy将原始数组的值复制到新的内存区域。
请注意,不可能仅使用函数的当前参数来执行此操作,因为这些参数均不能指示数组的大小:

  • data是指向数组第一个元素的指针;
  • n_index是数组中元素之一的索引;
  • swap_index是数组中另一个元素的索引。*

  • 因此,您应该在函数int size中添加第四个元素,以指定数组中有多少个元素。您可以将size用作mallocmemcpy的参数,或者编写一个遍历数组元素的for循环。
    出现新问题:如果您调用malloc分配新的内存,那么用户将不得不在某些时候调用free释放内存。
    C++具有很酷的关键字new,其语法比malloc的语法更轻巧。但这并不能解决主要问题。如果使用关键字new分配新的内存,那么用户将不得不在某个时候使用关键字delete释放内存。
    gh,这么重的负担!
    但这是C方式。在C++中,一个好的经验法则是:从不手动处理数组。标准库为此提供了std::vector。在某些情况下,使用new可能是最佳解决方案。但在大多数情况下,事实并非如此。
    C++方式:std::vector使用标准库中的std::vector类,您的代码将变为:
    #include <vector>
    
    std::vector<int> Node::dataSwap(std::vector<int> data, int n_index, int swap_index)
    {
        std::vector<int> new_data = data;
        int swapped = data[n_index];
        int to_swap = data[swap_index];
        new_data[n_index] = to_swap;
        new_data[swap_index] = swapped;
    
        return (new_data);
    }
    
    没有malloc,没有new,没有free和没有delete。类std::vector在内部处理所有这些。您也不需要手动复制数据。初始化new_data = data调用std::vector类的副本构造函数,并为您完成此操作。
    尽量避免使用new;使用一个内部处理所有内存的类,就像您希望使用更高级的语言一样。
    或者,甚至更简单:
    C++方式:std::vectorstd::swap
    #include <vector>
    #include <algorithm>
    
    std::vector<int> Node::dataSwap(std::vector<int> data, int n_index, int swap_index)
    {
        std::vector<int> new_data = data;
        std::swap(new_data[n_index], new_data[swap_index]);
    
        return (new_data);
    }
    

    关于c++ - C++函数更改传递参数的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64030838/

    10-14 17:29
    查看更多