C++魔术广场

Magic Square in C++

本文关键字:魔术 C++      更新时间:2023-10-16

又是一个魔方问题。我正在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*,以节省调用方处理和删除指针的麻烦。

你只是部分实例化矩阵。 您有int **matrix = new int *[n]它将为您提供行,但您正在定义列。 要完全初始化,您需要使用

int **matrix = new int *[n];
for (int i = 0; i < col_dimension; i++)
    matrix[i] = new int[col_dimension];

您正在取消引用空指针。您有一个二维数组:

int **matrix = new int *[n];

您清除(不正确 - 大小应该是n * sizeof(*matrix)):

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

然后立即写进:

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

matrix[0]NULL.您需要先分配所有指针!

for (int i = 0; i < n; ++i) {
    matrix[i] = new int[whatever];
}

使用向量。

    vector<vector<int> > matrix(n, vector<int>(n, 0));
    OddMagicSquare(matrix, n, -1);

void OddMagicSquare(vector<vector<int>> &matrix, int n)
{
    auto nsqr = n * n;
    // start position
    auto row = rand() % n;
    auto col = rand() % n;
    auto start = 1;
    for (auto index = start; index <= nsqr + (start -1); ++index)
    {
        while (col >= n)
            col -= n;
        while (col < 0)
            col += n;
        while (row >= n)
            row -= n;
        while (row < 0)
            row += n;
        matrix[row][col] = index;
        row--;
        col++;
        if (index%n == 0)
        {
            row += 2;
            --col;
        }
    }
}