另一个魔方问题。我正在用C++创建一个奇怪的魔方程序,由于某种原因,该程序不断给出分段错误并退出。这是代码:

#include <iostream>

using std::cin;
using std::cout;

#include <cstring>

using std::memset;

int *generateOddSquare(int n) {
    if (n % 2 != 0 && n >= 3) {
        int row = 0, col = n / 2, square = n * n;
        int **matrix = new int *[n], *dest = new int[square];

        memset(matrix, 0, sizeof(matrix[0][0]) * square);

        for (int i = 1; i <= square; i++) {
            matrix[row][col] = i;

            if (i % n == 0)
                row++;
            else {
                if (row == 0)
                    row = n - 1;
                else
                    row--;

                if (col == (n - 1))
                    col = 0;
                else
                    col++;
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                dest[(i * n) + j] = matrix[i][j];
            }
        }

        return dest;
    } else
        return NULL;
}

int main() {
    int *arr = generateOddSquare(3);

    for (int i = 0; i < 9; i++) {
        cout << arr[i] << "\n";
    }
}

怎么了我声明指针的方式正确吗?

最佳答案

您创建一个指针数组:

int **matrix = new int *[n]

但是不要初始化那些指向任何东西的东西;因此,当您尝试取消引用它们时出现分段错误。如果确实必须使用指针,则为每个指针分配一个数组以指向:
for (int i = 0; i < n; ++i) {
    matrix[i] = new int[n];
}

如果您担心内存泄漏,请不要忘记删除所有这些分配。

除非这是受虐狂锻炼,否则请使用标准库使生活更轻松:
std::vector<std::vector<int>> matrix(n, std::vector<int>(n));

并返回std::vector<int>而不是int*来节省调用者使用和删除指针的麻烦。

关于c++ - C++中的魔方,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29631245/

10-10 11:26