c++ - 数组的大小的问题
天蓬老师
天蓬老师 2017-04-17 14:48:36
0
2
539
#include <iostream>

using namespace std;

int main()
{
    char*a[]={"zzzz","zz","zzzzzzz"};
    cout << sizeof(a) << endl;
    return 0;
}

为什么输出是24呢?为什么数组的大小不是5 + 3 + 8 = 16呢?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(2)
巴扎黑

a は 3 つの文字列定数のアドレスを格納します。アドレスはポインタでもありません。

 |----------|
        |xxxxxx|
        |----------| |----------|
 --> ポインタ 1 |
        |----------| |----------|
        | ポインタ 2 | ------------------------>
        |----------| |----------|
        | ポインタ 3 |
        |----------| |----------|
        | xxxxx | コード>
sizeof(a) == 3 * sizeof(ポインタ) = 24

32 ビットのオペレーティング システムを使用している場合、ポインタの長さは 4 バイト、64 ビットの場合は 8 バイトであるため、コンパイル環境は 64 ビットであると推測できます。

いいねを押す +0
大家讲道理

C/C++ 宣言は左から右に読み取ることができません。右に何もない場合は、カーソルを左に移動します。左側では、前のレベルに移動します。最初のステップが括弧に対して繰り返され、括弧がなくなると終了します。 [1]

つまり、char* a[] は次のことを意味します。

a は char へのポインタの配列です

文字列リテラルを使用して char* を初期化する場合、ポインタ変数はメモリ内の文字列定数のアドレスを格納します。

つまり、

sizeof(a) == 3 * sizeof(char*)

64 ビット システムの場合、

sizeof(char*) == 8

それで

sizeof(a) == 24

さらに、C/C++ の配列のサイズは、常に配列内の 1 つの要素のサイズに配列内の要素の数を乗算したものと等しくなります。

これは、配列のサイズを計算するときは常に、複数の等しくない数値を加算しないことを意味します。

変数が占めるメモリ空間をその部分の合計と等しくしたい場合は、次のように記述できます。

#include 

int main() {
  構造体 {
    文字 a[5];
    文字 b[3];
    char c[8];
  a = {"zzzz", "zz", "zzzzzzzz"};

  printf("%lu\n", sizeof(a)); // 16 = 5 + 3 + 8
}
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート