在 C++ 中使用具有用户输入维度的动态分配二维数组生成 NxN 幻方

Generating an NxN magic square using a dynamically allocated 2D array in C++ with user-input dimension

我正在尝试通过动态内存分配生成并求解 NxN 奇数幻方,但每当我 运行 代码时,它在终端上什么都不显示,程序结束。我认为它与二维数组的动态分配有关,因为当我制作一个具有恒定大小的普通 NxN 数组时,程序 运行 没问题。对此,我将不胜感激!

#include<bits/stdc++.h>
#include<cmath>

using namespace std;

void calcuateMagicSquare(int N)

{

    int **Array;
    Array=new int*[N];
        for(int i=0; i<N; i++)
        {
            Array[i]=new int[N];
        }
        memset(Array, 0, sizeof(Array));
    int nSquare=N*N;
    int i=N/2;
    int j=N-1;
        for(int k=1; k<=nSquare;)
        {
            if(i==-1 && j==N)
            {
                j=N-2;
                i=0;
            }
            else
            {
                if(j==N)
                {
                    j=0;
                }
                if(i<0)
                {
                    i=N-1;
                }
            }
            if(Array[i][j])
            {
                j=j-2;
                i++;
                continue;
            }
            else
            {
                Array[i][j]=k++;
            }
            j++;
            i--;
        }
    int SolutionMagicSquare=N*(N*N+1)/2;
        cout << "Solution of the magic Square: " << SolutionMagicSquare << endl;
        cout << "MAGIC SQUARE: \n" << endl;
        for(int i=0; i<N; i++)
        {
            for(int j=0; j<N; j++)
            {
                cout << setw(4) << Array[i][j] << " ";
                cout << endl;
            }
        }

}

int main()

{

    int N;
        cout << "Please enter the dimension of the magic square:" << endl;
        cin >> N;
        calcuateMagicSquare(N);

}

这还不错。

    int ** Array=new int*[N];
    for(int i=0; i<N; i++)
    {
        Array[i]=new int[N];
    }
    memset(Array, 0, sizeof(Array));

memset 给您带来了麻烦,它的错误有两个原因。首先,假设你真的想这样做。你没有,但假设你有。 sizeof(Array)有多大。数组是一个 int **。在 64 位机器上,这是 8 个字节。这么方便,你只销毁了第一个指针。

你真正需要做的是:

    int ** Array=new int*[N];
    // Don't do this memset, but showing you what it should look like)
    memset(Array, 0, sizeof(int *) * N);
    for(int i=0; i<N; i++)
    {
        Array[i]=new int[N];
        // But this one is safe
        memset(Array[i], 0, sizeof(int) * N);
    }

您的版本正在擦除第一个指针 -- Array[0]。我把第一个 memset 放在那里,这样你就可以在需要时看到它的样子。这是你需要的第二个。您正在清除 int 的大小乘以您拥有的 int 的数量。