尝试分配值时,C ++代码会中断

时间:2012-04-21 03:42:38

标签: c++ visual-studio multidimensional-array double-pointer

我是C ++的新手,正在尝试使用双指针为多维数组编写代码。这是我的代码:

班级宣言:

class magicMat{

    private:
         int** ptrnum;

    public:
        void init(int);
        void Display(int);
        void set(int);
        void message();
        void errorhandling(int);    
};

功能定义:

void magicMat::init(int input)
{       
    ptrnum=new int*[input];

    for (int row=0;row<input;row++)
        ptrnum[row]=new int[input]; 

    for(int x=0;x<input;x++)
    {
        for (int y=0;y<input;y++)
        {
            *(ptrnum[x]+y)=0;
        }
    }
}

void magicMat::set(int input)
{
    int row=1,col=input/2,otherdiag=0;

    for(int value=1;value<=input*input;value++)
    {
        if (*(ptrnum[row]+col)>0)
        {
            row=row+2;
            if(row>input)
                row=row-input;

            col--;
            if(col<1)
                col=input;
        }
        *(ptrnum[row]+col)+=value;
        *(ptrnum[0]+col)+=value;
        *(ptrnum[row]+0)+=value;

        if (row==col)
            *(ptrnum[0]+0)+=value;          

        if (row+col==input+1)
            otherdiag+=value;                 
/*                                                                        */
/*       Determine where new row and col are                              */
/*                                                                     */
         row--;
         if (row < 1)                       /* If row exceeds side then   */
            row = input;                    /*  goto other side.          */
         col++;
         if (col > input)                   /* If col exceeds side then   */
            col = 1; 
    }       
}

主要功能:

int main()
{
    int num;
    magicMat newMat;
    newMat.message();
    while(1)
    {
        cin>>num;
        if (cin.good())
        {
            newMat.errorhandling(num);
        }
        else if (!isdigit(num))
        {
            cout<<"Please enter only digits"<<endl;
        }    
        newMat.init(num);
        newMat.set(num);
        newMat.Display(num);
    }
    cout<<"\nBye bye!\n"<<endl;
    return 0;
}

它适用于init函数,但在set函数中,我尝试检查它在if数据函数中的第一个set语句处断开的值。

1 个答案:

答案 0 :(得分:0)

你正走出数组的边界。举个例子,如果我运行您的代码并输入5作为我的第一个数字,将input的值设置为5,请查看{{1}末尾的这些行功能:

set

row--; if (row < 1) row = input; 函数第一次循环结束时,set等于row。这三行执行,因此1设置为row

5的下一个循环开始时,您可以执行以下操作:

set

问题是if (*(ptrnum[row]+col)>0) 是一个5x5数组,这意味着有效索引是0-4。但是,在上一个循环结束时,您将ptrnum设置为等于row,因此,您将在5的范围之外进行索引,从而导致程序崩溃。

我强烈建议您在调试器中单步调试代码,或者如果您不确定如何执行此操作,请至少在ptrnum函数中添加一些cout语句,以便您可以检查变量是否设置为您认为应该设置的值。

祝你好运!