0

memsetsize の動的配列を設定するために使用しようとしていますrownum x rownmum。ただし、showarr以下に示すように関数を呼び出すと、すべてゼロ (つまり ASCII 48) の出力を取得する代わりに、ランダム/ガベージ値が取得されます。

void showarr(int **a, int rownum)
{
        for ( int i = 0; i < rownum; i++) {
                for ( int j = 0; j < rownum; j++) {
                        cout<<a[i][j]<<endl;
                }
        }
}

int main(int argc, char *argv[])
{
        int n;
        cin>>n;

        int rownum;
        cin>>rownum;
        int **a = new int* [rownum] ;
        for ( int i = 0; i <rownum; i++) {
             a[i] = new int[rownum];
        }
        for (int i = 0; i < rownum; i++) {
              memset(a[i],48,sizeof(a[i]));
        }
        showarr(a,rownum);

        return 0;
}
4

2 に答える 2

5

sizeof(a[i]) == sizeof(int *); sizeof演算子を使用して、動的に割り当てられた配列の長さを取得することはできません。行う

memset(a[i], '0', sizeof(a[i][0]) * rownum);

代わりは。

(また、コード内のマジックナンバーとしてASCII値を使用することは控えてください。)

于 2012-01-25T13:02:38.183 に答える
0

問題が何であるかについては、larsmans の回答を参照してください。これはベクトルに簡単に置き換えられます (メモリリークの可能性はありません) (コンパイル/テストされていません):

#include <vector>
#include <iostream>

typedef std::vector<int> vector1D;
typedef std::vector<vector1D> vector2D;

void showarr(const vector2D& v)
{
        for (vector2D::iterator it1 = v.begin(); it1 != v.end(); ++it1) {
                for (vector1D::iterator it2 = it1.begin(); it2 != it1.end(); ++it2) {
                        cout<<*it2<<endl;
                }
        }
}

int main()
{
        int rownum;
        cin>>rownum;
        vector2D a();
        for (int i = 0; i <rownum; i++) {
             a.push_back(vector1D(rownum, '0'));
        }
        showarr(a);
}
于 2012-01-25T13:17:17.827 に答える