1

ダブルポインターメソッドを使用して、C++ で 2 次元配列を作成しようとしています。しかし、変数を初期化すると、配列のサイズは常に8になります。最初にこれを試しました:

  double** sobel_x;

そして、サイズを8にしました。そして、これを試したとき:

  double** sobel_x;
  sobel_x = new int*[3];
  for(int i = 0; i < sizeof(sobel_x); i++) {
    sobel_x[i] = new int[3];
  }

配列がサイズ8に初期化される理由と、そのサイズを変更する方法を最初に説明してもらえますか?

4

2 に答える 2

4

このコード:

double** sobel_x = new int*[3];
std::cout << sizeof(sobel_x);

は、実行時にこのポインターに何を割り当てたかに関係なく、コンパイル時に (この場合は型に基づいて) 評価されるため、常にsizeof ポインターを出力します。sizeofdouble**

std::vector代わりに使用してください:

std::vector< std::vector<double> > sobel_x(3, std::vector<double>(3, 0.0));
std::cout << sobel_x.size();

サイズを取得できたとしても、サイズはバイト単位になることに注意してください。要素の数はわかりません。配列でこれを実現するには、自動ストレージ期間で静的配列を使用できます。

double sobel_x[3][3] = { 0.0 };
std::cout << sizeof(sobel_x);                         // <-- outputs 72
std::cout << sizeof(sobel_x[0]);                      // <-- outputs 24
std::cout << sizeof(sobel_x) / sizeof(sobel_x[0]);    // <-- outputs 3
于 2013-10-05T09:52:30.213 に答える
1

sobel_x で sizeof を呼び出しており、sobel_x はポインターです。これは、8 がシステム (おそらく 64 ビット マシン) 上のポインタのサイズであることを意味します。

この投稿では、やりたいことができないことを説明しています: C++: 関数に渡された多次元配列の行サイズを取得する

実行時に長さを計算する必要がある場合は、ベクターなどの STL クラスのいずれかを使用します。

ただし、単純なユースケースでは、sobel_x が指す配列に含まれる要素の数 (この場合は 3) は既にわかっているので、それをループのテスト条件として使用してください。

于 2013-10-05T09:53:12.550 に答える