-2

実行時に2次元配列を割り当てようとしています。配列のサイズはN*Nです。ここで、Nはユーザーが入力します。最後に、割り当てられたメモリを削除します。しかし、セグメンテーション違反が発生しています。自分が割り当てていないメモリにアクセスしようとすると、セグメンテーション違反が発生することを知っています。ヘルプコードは次のとおりです。

#include<iostream>
using namespace std;
#include <stdio.h>

int main ()
{
    int t,n;
    int **judge;
    int **result;
    int i,j,l;
    int high;
    float count;
    int item;
    cin>>t;
    while(t-->0)
    {
        cin>>n;
        judge=new int*[n];result=new int*[n];
        for(i=0;i<n;i++)
        {
            judge[i]=new int[n];
            result[i]=new int[n];
        }

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                cin>>judge[i][j];
            }
        }
        count=0;
        result[0][0]=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                item=0;
                if(j>0&&i>0)
                {
                if(item<result[i][j-1])
                    item=result[i][j-1];
                else if(item<result[i-1][j])
                    item=result[i-1][j];
                }
                else if(i==0)
                {
                    if(item<result[i][j-1])
                        item=result[i][j-1];
                }
                else if(j==0)
                {
                    if(item<result[i-1][j])
                        item=result[i-1][j];
                }

                result[i][j]=judge[i][j]+item;
            }
        }

        if(result[n-1][n-1]<0.0)
            cout<<"Bad Judges"<<endl;
        else
        {
            count=(result[n-1][n-1]/(float)n);
            cout<<count<<endl;
        }

        for( i = 0 ; i < n  ; ++i)
        {
            delete[] result[i] ;
        }
        delete[] result;
        for(i = 0 ; i < n ; ++i)
        {
            delete[] judge[i] ;
        }
        delete[] judge;
        /* for(i=0;i<n;i++)
        {
            delete[] judge[i];
            delete[] result[i];       
        }*/
        // delete[] judge;
        //delete[] result;
    } 
}
4

2 に答える 2

3

judgeまでループn+2し、それほど割り当てません。

これらの3行で:

for(int i = 0 ; i < n + 2 ; ++i)
{
   delete[] judge[i] ;
}

ちなみに、割り当てていないメモリにアクセスするのはこれだけではありません。

for(i=1;i<n+1;i++)
{
   for(j=1;j<n+1;j++)
   {
     cin>>judge[i][j];
   }
}

ここでij最大に達する可能性がnありますが、割り当てでは最大の値が許可されますn -1

于 2012-12-13T14:59:16.290 に答える
0

のようなループがいくつかあります

for(i=1;i<n+1;i++)

C ++では、配列は0からインデックス付けされるため、代わりに[0..n)を使用する必要があります

for(i=0;i<n;i++)
于 2012-12-13T15:03:38.903 に答える