C で動的サイズの配列を正しく宣言するにはどうすればよいでしょうか?

Linda Hamilton
リリース: 2024-11-18 10:45:02
オリジナル
583 人が閲覧しました

How Can You Correctly Declare an Array with a Dynamic Size in C?

配列サイズが可変の場合の C での動的配列作成

次のコード スニペットを考えてみましょう。

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 の可変長。フレキシブル配列とも呼ばれる可変長配列は、C 標準の一部ではありません。その結果、上記のコードは正しくコンパイルされません。

代替ソリューション

この問題にはいくつかの代替ソリューションがあり、それぞれに長所と短所があります。

1. std::vector

std::vector は、動的な配列のようなデータ構造を提供する C の標準ライブラリ コンテナーです。必要に応じてメモリの割り当てと再割り当てが自動的に行われるため、配列サイズを手動で宣言する必要がなくなります。次のコードは、このシナリオで std::vector を使用する方法を示しています。

std::vector<char> Sbuf;

Sbuf.push_back(someChar);
ログイン後にコピー

2. new Operator

もう 1 つのオプションは、new 演算子を使用して配列に動的にメモリを割り当てることです。ただし、このアプローチでは手動のメモリ管理が必要となり、メモリ リークのリスクが高まります。さらに、動的配列には直接メモリ割り当てではなく std::vector を使用することを一般的に推奨します。

char* Sbuf = new char[siz];

// ...

delete [] Sbuf;
ログイン後にコピー

3.外部ライブラリ

GNU C ライブラリ (glibc) などの特定の外部ライブラリは、可変長配列のサポートを提供します。ただし、この機能は非標準であり、すべてのコンパイラやプラットフォームでサポートされているわけではありません。

以上がC で動的サイズの配列を正しく宣言するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート