次のコード スニペットを考えてみましょう。
int siz = 0; int n = 0; FILE* picture; picture = fopen("test.jpg", "r"); fseek(picture, 0, SEEK_END); siz = ftell(picture); char Sbuf[siz]; fseek(picture, 0, SEEK_SET); //Going to the beginning of the file while (!feof(picture)) { n = fread(Sbuf, sizeof(char), siz, picture); /* ... do stuff with the buffer ... */ }
このコードでは、次のことを目的としています。ファイル「test.jpg」のサイズを読み取り、その内容を保存する配列 Sbuf を作成します。ただし、Sbuf のサイズは、ファイルのサイズに基づいて動的に決定されます。ここで疑問が生じます: コードが正常にコンパイルされるように、siz を正しく宣言するにはどうすればよいでしょうか?
残念ながら、次のような配列を作成する簡単な方法はありません。 C の可変長。フレキシブル配列とも呼ばれる可変長配列は、C 標準の一部ではありません。その結果、上記のコードは正しくコンパイルされません。
この問題にはいくつかの代替ソリューションがあり、それぞれに長所と短所があります。
std::vector は、動的な配列のようなデータ構造を提供する C の標準ライブラリ コンテナーです。必要に応じてメモリの割り当てと再割り当てが自動的に行われるため、配列サイズを手動で宣言する必要がなくなります。次のコードは、このシナリオで std::vector を使用する方法を示しています。
std::vector<char> Sbuf; Sbuf.push_back(someChar);
もう 1 つのオプションは、new 演算子を使用して配列に動的にメモリを割り当てることです。ただし、このアプローチでは手動のメモリ管理が必要となり、メモリ リークのリスクが高まります。さらに、動的配列には直接メモリ割り当てではなく std::vector を使用することを一般的に推奨します。
char* Sbuf = new char[siz]; // ... delete [] Sbuf;
GNU C ライブラリ (glibc) などの特定の外部ライブラリは、可変長配列のサポートを提供します。ただし、この機能は非標準であり、すべてのコンパイラやプラットフォームでサポートされているわけではありません。
以上がC で動的サイズの配列を正しく宣言するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。