「sizeof」(配列を指すポインター) を見つける方法は?

いいえ、できません。コンパイラは、ポインターが何を指しているのかわかりません。既知の範囲外の値で配列を終了し、その値までサイズをカウントするなどのトリックがありますが、それは sizeof() を使用していません .

別のトリックは、サイズをどこかに隠しておくことです。たとえば、配列を動的に割り当てる場合は、必要なブロックよりも 1 int 大きいブロックを割り当て、最初の int にサイズを隠して、ptr+1 を返します。 配列へのポインタとして。サイズが必要な場合は、ポインターをデクリメントし、隠し値を確認します。配列だけでなく、ブロック全体を最初から解放することを忘れないでください。


答えは「いいえ」です。

C プログラマーが行うことは、配列のサイズをどこかに格納することです。構造体の一部であるか、プログラマーが少しごまかして malloc() することができます 配列の開始前に長さの値を格納するために、要求されたよりも多くのメモリが必要です。


動的配列 (malloc または C++ new )他の人が述べたように配列のサイズを保存するか、おそらく追加、削除、カウントなどを処理する配列マネージャー構造を構築する必要があります。残念ながら、基本的に構築する必要があるため、CはC ++ほどうまく機能しませんこれは、管理する必要がある配列の種類が複数ある場合に面倒です。

あなたの例のような静的配列の場合、サイズを取得するために使用される一般的なマクロがありますが、推奨されません パラメータが実際に静的配列であるかどうかをチェックしないためです。ただし、マクロは実際のコードで使用されます。以下のものとは若干異なる場合がありますが、Linux カーネル ヘッダー内:

#if !defined(ARRAY_SIZE)
    #define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
#endif

int main()
{
    int days[] = {1,2,3,4,5};
    int *ptr = days;
    printf("%u\n", ARRAY_SIZE(days));
    printf("%u\n", sizeof(ptr));
    return 0;
}

このようなマクロに警戒する理由については、グーグルで検索できます。注意してください。

可能であれば、はるかに安全で使いやすい vector などの C++ 標準ライブラリ。