1. ホーム
  2. c++

[解決済み] なぜCやC++コンパイラは関数シグネチャで配列の長さを強制しないのに許可するのですか?

2022-06-15 18:32:49

疑問点

これは、私が学習期間中に見つけたものです。

#include<iostream>
using namespace std;
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;
}  

ということで、変数の中に int dis(char a[1]) は、その [1] では何もしないし、動作しないようです。

を使うことができるからです。 a[2] . と同じように int a[] または char *a . 配列名がポインタであることも、配列を伝える方法も知っているので、私のパズルはこの部分についてではありません。

私が知りたいのは、なぜコンパイラがこの動作を許すのか( int a[1] ). あるいは、私の知らない他の意味があるのでしょうか?

どのように解決するのですか?

関数に配列を渡す構文のクセです。

配列を渡すように見える構文を書いたとしても、実際に起こるのは、代わりに配列の最初の要素へのポインタが渡されることです。

ポインタは長さの情報を含んでいないので、あなたの [] の内容は実際には無視されます。

この構文を許可する決定は1970年代になされ、それ以来多くの混乱を引き起こしてきました...