関数シグネチャの配列長: 交絡する異常
C および C では、関数シグネチャには角括弧で囲まれた配列長が含まれることがよくあります。例のように:
int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; }
ただし、この構文は次のようになります。上記のコードが宣言された配列の長さを超える要素に正常にアクセスするという事実が示すように、実際的な効果はありません。このため、コンパイラはなぜこの一見冗長な表記を許可するのでしょうか?
その答えは、C および C における配列処理の実装の詳細にあります。 C および C の配列は、配列の最初の要素を指すアドレスです。配列が関数に渡されると、そのアドレスがコピーされ、実質的にポインタが渡されます。
上の例では、関数 dis は宣言された長さが 1 の文字 a の配列を受け取ります。配列はポインターとして渡され、長さの指定は無関係で、インデックスが宣言された長さを超えている場合でも、関数は配列の任意の要素にアクセスできます。
パラメーター構文のこの矛盾により、これらの言語の初期に導入されて以来、数十年にわたり議論の対象となってきました。より一貫性のある構文を主張する人もいますが、現在の動作を維持する理由としてレガシー コードとの互換性を挙げる人もいます。
混乱を引き起こす可能性があるにもかかわらず、関数シグネチャで長さが指定されていない配列の許容は副産物です。 C および C における配列のポインターベースの実装。これは、異なる言語機能間の相互作用から生じる可能性のある微妙なニュアンスを思い出させるのに役立ちます。
以上がC および C 関数のシグネチャでは、効果のない配列長が許可されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。