これはしばらくの間私を悩ませました。多くの場合、「最大」量のデータを保持するために大きなバッファーを作成していることに気づきます。これにより、次のデータ セットのサイズが変更されるたびにバッファを動的に割り当てたり割り当て解除したりする必要がなくなります。
たとえば、実際の有用なサイズに対して大きすぎる配列があるとしますが、有用なデータの長さはわかっています。
int amountOfData = 9;
char data1D[100] = some data that is only 9 bytes long stored in a 100 byte array
2D 配列インデックスを使用するこのデータ セットに対して実行したいアルゴリズムがあるとします。したがって、次のようにデータにアクセスできるようにしたいと考えています。
cout << "I am accessing this data as a 2D array: " << data1D[0][1] << endl;
このアルゴリズムでは、2D 配列の xlength と ylength が次のようになることがわかっているとします。
int xlength = 3;
int ylength = 3;
この反復では、amountOfData = 9
. ただし、次の反復では長さが異なる場合があります。すなわち。それらは可能でxlength = 4
あり、ylength = 4
与えられamountOfData = 16
ます。
2D 配列のインデックスを使用して 1D 配列をキャストできるようなキャストを行いたいと考えています。最初の 1D の長さはわかっています。これは 2Dxlength
との長さを教えてくれます。したがって、最初の 100 バイトが有用なデータ セットを保持するのに十分な長さである限り、これylength
を使用しなくても簡単に実行できるはずです。new
malloc
気付いた:
char** data2d = (char**) data1D;
コンパイラは 2 番目の次元のサイズを認識していないため、機能しません。しかし、私は実行時にそれが何であるかを知っています!
このようになっている根本的な理由は何ですか?回避策はありますか? 何か不足していますか?