C および C では、関数シグネチャに int a[ のように角かっこ内の配列長が含まれる場合があります。 1]。しかし、この動作は開発者を困惑させています。長さには実質的な効果はないようです。
次の例を考えてみましょう。
#include <iostream> int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; }
このコードでは、関数 dis は次の配列パラメータを宣言しています。長さは 1 (a[1]) ですが、a[2] にアクセスすることは可能です。ここで疑問が生じます: 強制されていないのに、コンパイラは関数シグネチャで配列の長さを許可するのはなぜですか?
答えは、C/ で渡す配列の独特の動作にあります。 C.他の多くの言語とは異なり、C および C では関数に配列を直接渡すことはできません。代わりに、配列の最初の要素へのポインターが渡されます。
その結果、関数シグネチャで指定された配列の長さは無関係になります。長さの情報はポインターに含まれないため、コンパイラーは括弧内の長さを単純に無視します。
この動作は、1970 年代の C 開発の初期段階での決定に由来します。長年にわたって混乱を引き起こしてきましたが、この構文は C と C の両方で依然として普及しています。
配列の受け渡しのこの癖には、いくつかの影響があります。
以上がC/C 関数シグネチャの配列長がコンパイラによって無視されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。