1. ホーム
  2. c++

[解決済み] C/C++で0サイズの配列を定義するとどうなりますか?

2022-05-16 15:46:27

質問

長さ0の配列を定義した場合、実際に何が起こるのでしょうか? int array[0]; をコードで定義した場合、実際に何が起こるのでしょうか?GCCはまったく文句を言いません。

サンプルプログラム

#include <stdio.h>

int main() {
    int arr[0];
    return 0;
}

明確化

実は、Darhazerさんのコメントにある可変長のように指摘されるのではなく、このように初期化されたゼロ長の配列は最適化されるのか、されないのかを考えています。

これは、私はいくつかのコードを野に放たなければならないので、私が SIZE として定義されている場合 0 と定義されている場合、静的に定義された int array[SIZE];

実は、GCCが文句を言わないことに驚いていて、それが私の質問につながりました。私が受け取った回答から、警告がないのは、新しい [] 構文で更新されていない古いコードをサポートしていることが主な原因であると思います。

私は主にエラーについて疑問に思っていたので、私は Lundin の回答を正しいものとしてタグ付けしています (Nawaz の回答が最初でしたが、それほど完全ではありませんでした) -- 他の方々は、テールパッド構造の実際の使用について指摘していましたが、関連性はあっても私が求めていたものではありません。

どのように解決するのですか?

配列のサイズを0にすることはできません。

ISO 9899:2011 6.7.6.2です。

式が定数式の場合,0より大きい値を持たなければならない。

上記の文章は、プレーン配列の場合(1項)にも当てはまります。VLA(可変長配列)の場合、式の値が0以下であれば、動作は不定です(第5項)。これはC規格の規範的な文章である。コンパイラがこれと異なる実装をすることは許されません。

gcc -std=c99 -pedantic はVLAでない場合の警告を出します。