c++ - 二维阵列反转线中的段错误

标签 c++ c++11

我正在尝试反转二维 double 组的行。 由于数组是动态的,因此它的创建方式如下

double** revArr = new double*[m];
for (int i = 0; i < m; i++)
    revArr[i] = new double[n];

我最终通过正常方式将原始数组复制到反转数组

for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
        revArr[i][j] = arr[i][j];

现在最精彩的部分来了!然后我尝试反转数组的行,并尝试了几种不同的方法。

int start = 0, end = n;
for (int i = 0; i < m; i++) {
    while (start < end)
    {
        double *temp = revArr[start];
        revArr[start] = revArr[end];
        revArr[end] = temp;
        start++; end--;
    }
}

由于该数组是一个 double* 数组,它会抛出一个 SegFault,我不确定如何修复!

我尝试过使用 std::swap,我尝试过使用 std::reverse,我不太确定从这里转向哪里。

最小可重现示例:

#include <iostream>

int main() {
    int m = 4, n = 4;

    double* arr = new double[m];
    for (int i = 0; i < m; i++)
        arr[i] = new double[n];

    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            arr[i][j] = i + j;

    int start = 0; end = n;
    for (int i = 0; i < m; i++) {
        while (start < end)
        {
            double *temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
            start++; end--;
        }
    }
}

最佳答案

编辑:从下面OP的评论来看,他似乎想交换每行上的数字而不是行本身。代码应更改为:

for (int i = 0; i < m; i++) {
    for (int j = 0; j < n / 2; j++) {
        std::swap(arr[i][j], arr[i][n - j - 1]);
    }
}

以下是我的一些建议:

  1. 使用标准库:标准库的存在是有原因的,没有理由不使用它。例如,您可以像这样轻松地反转数组:
for (int i = 0; i < m; i++)
    std::reverse_copy(arr[i], arr[i] + n, revArr[i]); // if you are copying the reversed array onto another

或者

for (int i = 0; i < m; i++)
    std::reverse(arr[i], arr[i] + n);              // Copy the reversed result onto the same array
  • 请务必记住在使用后删除[]您的new[]编辑的数组,或考虑使用smart pointers甚至std::vector 。在这种情况下:
  • for (int i = 0; i < m; i++)
        delete[] arr[i];
    delete[] arr;
    

    关于c++ - 二维阵列反转线中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61104956/

    相关文章:

    c++ - 可变参数模板的罕见错误?

    c++ - 如何为对象提供不同的接口(interface)(最佳)

    c++ - 为什么C++函数对象需要引用类型成员变量?

    c++ - QToolBar 扩展按钮

    c++ - 搜索 "$"在 C++ 中返回错误

    c++ - 是否可以在解压缩列表后使用类型名称作为模板参数?

    c++ - doxygen 文档 C++ header 中的当前日期

    c++ - 为什么在右值引用构造函数的初始化列表中使用 std::forward 而不是 std::move 作为数据成员?

    c++ - 调用 LLVM 中隐式删除的复制构造函数(将代码从 windows 移植到 mac)

    c++ - C++0x 中的缩小转换。只是我,还是这听起来像是一个重大变化?