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

C および C コンパイラが関数シグネチャの配列長を無視するのはなぜですか?

Barbara Streisand
リリース: 2024-12-29 14:59:15
オリジナル
265 人が閲覧しました

Why Do C and C   Compilers Ignore Array Lengths in Function Signatures?

関数シグネチャの配列: 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 プログラミング言語。その影響を理解することは、安全かつ効率的なコード開発にとって非常に重要です。

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

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