ホームページ > バックエンド開発 > C++ > C/C 関数シグネチャの配列長がコンパイラによって無視されるのはなぜですか?

C/C 関数シグネチャの配列長がコンパイラによって無視されるのはなぜですか?

Patricia Arquette
リリース: 2024-12-22 16:28:15
オリジナル
567 人が閲覧しました

Why Are Array Lengths in C/C   Function Signatures Ignored by the Compiler?

C/C 関数シグネチャの配列長: 紛らわしい異常

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 の両方で依然として普及しています。

開発者への影響

配列の受け渡しのこの癖には、いくつかの影響があります。

  • 関数シグネチャ内の配列の長さは、関数の動作に影響を与えないため、無視する必要があります。 code.
  • この曖昧さを避けるために、配列はポインタ (char *a など) として宣言できます。
  • 配列を関数に渡すときは、配列のインデックスが範囲内にあることを確認することが重要です。 、長さ情報は関数シグネチャでは利用できないためです。

以上がC/C 関数シグネチャの配列長がコンパイラによって無視されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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