【问题标题】:Unhandled exception thrown: write access violation: Printing out array elements抛出未处理的异常:写访问冲突:打印出数组元素
【发布时间】:2020-11-09 18:33:11
【问题描述】:

我有一个函数,它打印出一个字符串数组。第二个函数应该打印反向列表,但由于某种原因,弹出一个名为 xmemory 的新选项卡,我收到消息:“未处理的异常抛出:写访问冲突。this->_Myproxy 是 0xCCCCCCCC。” 在网上搜索了几个小时后,我终于决定看看这里是否有人可以帮助我。

这是我的代码:

#include <iostream>
#include<string>
using namespace std;

void display(string array[5]);
void displayReverse(string array[5]);

int main()
{
    string fruit[5] = {"Apple", "Banana", "Orange", "Kiwi", "Cherry"};
    display(fruit);
    displayReverse(fruit);
    return 0;
}

void display(string array[5])
{
    for (int i = 0; i < 5; ++i)
    {
        cout << array[i] << endl;
    }
}

void displayReverse(string array[5])
{
    swap(array[1], array[5]);
    swap(array[2], array[4]);
    swap(array[4], array[5]);

    cout << array[1] << endl << array[2] << endl << array[3] << endl << array[4] << endl << array[5] << endl;
}

【问题讨论】:

  • 有效索引为 0size-1array[5] 越界并调用未定义的行为。
  • fwiw 如果您使用std::array 和反向迭代器,您可以编写整个代码而无需明确提及单个索引。或 std::reverse 如果您不仅想打印反转,而且实际上反转数组
  • 昨晚有人问了同样的问题。如果你有 c++20,这会有所帮助:https://en.cppreference.com/w/cpp/ranges/reverse_view
  • 非常感谢!它现在正在工作!

标签: c++ arrays string swap


【解决方案1】:

数组索引从0开始。它不会从1开始。所以如果你有5个元素的数组,你可以通过array[0]访问第一个元素。 array[1] 表示第二个元素。您的 displayReverse() 正在尝试访问数组中不存在的第 6 个元素。

以下是经过一些修改的代码。

#include <iostream>
#include <string>
using namespace std;

void display(string array[], int size);
void displayReverse(string array[]);

int main()
{
    string fruit[5] = {"Apple", "Banana", "Orange", "Kiwi", "Cherry"};
    display(fruit, 5);
    displayReverse(fruit);
    return 0;
}

void display(string array[], int size)
{
    for (int i = 0; i < size; ++i)
    {
        cout << array[i] << endl;
    }
}

void displayReverse(string array[])
{
    swap(array[0], array[4]);
    //swap(array[2], array[3]);
    swap(array[1], array[3]);

    cout << array[0] << endl << array[1] << endl << array[2] << endl << array[3] << endl << array[4] << endl;
}

【讨论】:

    【解决方案2】:
    #include <iostream>
    #include<string>
    using namespace std;
    
    void display(string array[5]);
    void displayReverse(string array[5]);
    
    int main()
    {
        string fruit[5] = {"Apple", "Banana", "Orange", "Kiwi", "Cherry"};
        display(fruit);
        displayReverse(fruit);
        return 0;
    }
    
    void display(string array[5])
    {
        for (int i = 0; i < 5; ++i)
        {
            cout << array[i] << endl;
        }
    }
    
    void displayReverse(string array[5])
    {
            for (int i = 4; i >= 0; i-=1)
        {
            cout << array[i] << endl;
        }
    
    }
    

    使用循环而不是交换。这真是个好主意。

    【讨论】:

      猜你喜欢
      • 2020-10-24
      • 2019-12-31
      • 2011-04-12
      • 2021-10-26
      • 1970-01-01
      • 2021-07-12
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多