【问题标题】:Swapping two initialized arrays in C++ using Void and Pointers使用 Void 和指针在 C++ 中交换两个已初始化的数组
【发布时间】:2020-07-19 01:20:07
【问题描述】:

我需要编写一个 C++ 程序,它在两个 1 维之间交换 使用指针和函数的数组。首先,一个名为 showValues 的 void 函数在交换之前显示两个数组,还有一个名为 swap 的 void 函数来交换两个数组之间的元素。

我的问题是:我应该交换函数,但由于某种原因它无法运行,我不确定代码中的错误在哪里

#include <iostream>
#include <iomanip>
using namespace std;
const int SIZE = 5;
void showValues(int[],int[]);
void swap(int[],int[]);

int main() {
    
    int array1[SIZE] = {10,20,30,40,50};
    int array2[SIZE] = {60,70,80,90,100};
    
    showValues (array1, array2);
    swap(array1, array2);
    
    return 0;
    
}

void showValues(int array1[], int array2[]){
    
    cout<<"The original arrays are as shown below: " << endl;
    cout << " Array 1 is: ";
    for (int i = 0; i < 5; ++i) {
        cout << array1[i] << "  ";
    }
    cout << "\n Array 2 is: ";
    for (int i = 0; i < 5; ++i) {
        cout << array2[i] << "  ";
    }
}

void swap(int array1[], int array2[])
{
    
    int temp,i;
    for(i=0; i<5; ++i)
    {
        temp = array1[SIZE];
        array1[SIZE] = array2[SIZE];
        array2[SIZE] = temp;
    }
    cout << "\nThe swapped arrays are as shown below: " << endl;
    cout << " Array 1 is: ";
    for (int i = 0; i < 5; ++i) {
        cout << array1[i] << "  ";
    }
    cout << "\n Array 2 is: ";
    for (int i = 0; i < 5; ++i) {
        cout << array2[i] << "  ";
    }
}

【问题讨论】:

  • 你好像忘了问问题。
  • swap() 函数中,temp = array1[SIZE]; 语句并没有按照您的想法执行。接下来的两个陈述也没有。他们都没有做你认为他们做的事。
  • 我应该交换函数,但由于某种原因它无法运行,我不确定代码中的错误在哪里
  • 下次在调试器中单步调试代码会非常有用。然后你会注意到temp 包含一个垃圾值,在调查为什么会这样时你会注意到SIZE 等于5,因此你正在访问超出数组末尾的array1[5](如它的最后一个元素是array1[4])。
  • 不要调用你的函数swap,同时有using namespace std;。您的代码很有可能会调用 std::swap 而不是您自己的版本。

标签: c++ arrays function pointers


【解决方案1】:

这部分代码没有意义:

    temp = array1[SIZE];
    array1[SIZE] = array2[SIZE];
    array2[SIZE] = temp;

SIZE 是 5。因此,您正在访问 array1[5]array2[5],即数组的第 6 个元素。然而,您的数组只有 5 个以开头的元素(array1[0]array1[4]array2 相同),因此您正在访问数组末尾之外的元素 ,即 @987654321 @ 那可能只是在某处破坏内存!

您可能打算在这里使用i,而不是SIZE,那么代码是有意义的。相反,将“幻数”5 替换为 SIZE 会很有用:

for(i = 0; i < SIZE; ++i)
{
  temp = array1[i];
  array1[i] = array2[i];
  array2[i] = temp;
}

【讨论】:

    【解决方案2】:

    void swap(int array1[], int array2[]) 函数是您遇到问题的地方。实际上,您甚至不需要其他功能来进行交换。您可以只使用在 #include &lt;utility&gt; 标头中定义的 std::swap()。由于两个数组的大小相同。

    例如,您可以按照以下方式做一些事情:

    #include <iostream>
    #include <iomanip>
    #include <utility>
    const int SIZE = 5;
    void showValues(int[], int[]);
    void swap(int[], int[]);
    
    int main() {
    
        int array1[SIZE] = { 10,20,30,40,50 };
        int array2[SIZE] = { 60,70,80,90,100 };
        int n = sizeof(array1) / sizeof(array2[0]);
    
        showValues(array1, array2);
        std::swap(array1, array2);
    
        std::cout << "\n\nThe swapped arrays are as shown below:\n ";
        std::cout << "\nArray 1 is: ";
        for (int i = 0; i < n; i++)
            std::cout << array1[i] << ", ";
    
        std::cout << "\nArray 2 is: ";
        for (int i = 0; i < n; i++)
           std::cout << array2[i] << ", ";
    
     
        return 0;
    
    }
    
    void showValues(int array1[], int array2[]) {
    
        std::cout << "The original arrays are as shown below: " << std::endl;
        std::cout << "\nArray 1 is: ";
        for (int i = 0; i < 5; ++i) {
            std::cout << array1[i] << "  ";
        }
        std::cout << "\nArray 2 is: ";
        for (int i = 0; i < 5; ++i) {
            std::cout << array2[i] << "  ";
        }
    }
    

    同时考虑不使用using namespace std;

    【讨论】:

    • 我不认为我们是否必须导入utility 头文件。 std::swap() 即使不使用它也已经存在。
    • @RohanBari,确实如此。但是,依赖具有其他头文件的其他头文件通常不是一个好主意。特别是如果您希望您的代码具有可移植性和可编译性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    相关资源
    最近更新 更多