これまで、次の構文は無効であると考えていましたが、
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);
}