0

これまで、次の構文は無効であると考えていましたが、

int B[ydim][xdim];

しかし、今日試してみたらうまくいきました!偶然に機能しないことを確認するために何度も実行しました.valgrindでさえセグメンテーション違反やメモリリークを報告しませんでした!! とても驚いています。g++ で導入された新機能ですか? 以下のプログラムの A で行ったように、正しいストライドでインデックスを付けることにより、常に 1D 配列を使用して行列を格納してきました。しかし、この新しい方法は、B の場合と同様に、非常にシンプルでエレガントなので、私はずっと望んでいました。本当に安全に使用できますか?サンプルプログラムを参照してください。

PS。問題があれば、g++-4.4.3 でコンパイルしています。

#include <cstdlib>
#include <iostream>

int test(int ydim, int xdim) {
// Allocate 1D array
    int *A = new int[xdim*ydim](); // with C++ new operator
    // int *A = (int *) malloc(xdim*ydim * sizeof(int)); // or with C style malloc
    if (A == NULL)
        return EXIT_FAILURE;

// Declare a 2D array of variable size
    int B[ydim][xdim];

// populate matrices A and B
    for(int y = 0; y < ydim; y++) {
        for(int x = 0; x < xdim; x++) {
            A[y*xdim + x] = y*xdim + x;
            B[y][x] = y*xdim + x;
        }
    }

// read out matrix A
    for(int y = 0; y < ydim; y++) {
        for(int x = 0; x < xdim; x++)
            std::cout << A[y*xdim + x] << " ";
        std::cout << std::endl;
    }
    std::cout << std::endl;

// read out matrix B
    for(int y = 0; y < ydim; y++) {
        for(int x = 0; x < xdim; x++)
            std::cout << B[y][x] << " ";
        std::cout << std::endl;
    }

    delete []A;
    // free(A); // or in C style
    return EXIT_SUCCESS;
}


int main() {
    return test(5, 8);
}
4

2 に答える 2

1

これは、C99の「可変長配列」またはVLAです。それらがg++でもサポートされている場合、それはC++標準の拡張であると思います。

いいですね。

于 2010-07-31T04:08:45.193 に答える
1

int b[ydim][xdim]スタック上で2次元配列を宣言しています。new一方、配列をヒープに割り当てます。

自明でない配列サイズの場合、スタックスペースが不足しないように、または配列を現在のスコープ外の何かに戻したい場合は、ヒープに配置することをお勧めします。

于 2010-07-31T04:10:07.283 に答える