関数シグネチャの配列: C と C の奇妙な異常
C と C では、通常、配列の長さは関数シグネチャ内で次のように指定されます。構文 int a[size]。ただし、これらの長さが強制されない場合、興味深い動作が発生します。
dis(char a[1]) の謎のケース
次のコード スニペットを考えてみましょう。
#include <iostream> using namespace std; int dis(char a[1]) { int length = strlen(a); char c = a[2]; // Attempt to access element beyond specified length return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; }
この例では、関数 dis はサイズ 1 の配列パラメータ a を宣言しています。ただし、プログラムは要素にアクセスします。このサイズを超えてもコンパイラ エラーは発生しません。ここで疑問が生じます: 強制されていないのに、コンパイラは関数シグネチャで配列の長さを許可するのはなぜですか?
風変わりな言語機能
答えは C とC は関数呼び出しで配列を処理します。実際には、配列を関数に直接渡すことはできません。代わりに、配列の長さに関する情報を持たずに、配列の最初の要素へのポインターが渡されます。
したがって、関数シグネチャ内で指定されたサイズ (この場合は [1]) はコンパイラーによって無視されます。 。この決定は 1970 年代に遡り、開発者の間で大きな混乱を引き起こしました。
プログラミングへの影響
この癖にはいくつかの影響があります。
この動作は不可解に見えるかもしれませんが、これは C および C 言語の固有の部分です。 C プログラミング言語。その影響を理解することは、安全かつ効率的なコード開発にとって非常に重要です。
以上がC および C コンパイラが関数シグネチャの配列長を無視するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。