搜索

首页  >  问答  >  正文

c++ - 数组的大小的问题

#include <iostream>

using namespace std;

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

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

天蓬老师天蓬老师2803 天前535

全部回复(2)我来回复

  • 巴扎黑

    巴扎黑2017-04-17 14:50:36

    a存放的是三个字符串常量的地址,并不是直接存放3个字符串,一个地址也就是一个指针

            |----------| 
            |  xxxxxx  |       
            |----------|        |--------|
     a -->  | pointer1 | -----> | "zzzz" |
            |----------|        |--------|      |------|
            | pointer2 | ---------------------> | "zz" |
            |----------|        |-----------|   |------|
            | pointer3 | -----> | "zzzzzzz" |
            |----------|        |-----------|
            |   xxxxx  | 
    sizeof(a) == 3 * sizeof(pointer) = 24

    如果你是32位操作系统,则指针长度是4字节,64位是8字节,可以推算出你的编译环境是64位的

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-17 14:50:36

    C/C++ 的声明并不能从左往右阅读,而是要先找到标识符,光标向右,待右侧没有东西时,光标向左,待左侧没有东西时,进入上一层括号重复第一步,待没有上一层括号时,结束。[1]

    也就是说,char* a[] 意味着,

    a is an array of pointers to char's

    当使用字符串字面量初始化 char* 时,该指针变量中存放的是字符串常量在内存中的地址。

    这也就是说,

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

    在 64-bit 系统中,

    sizeof(char*) == 8

    所以

    sizeof(a) == 24

    另外,C/C++ 中的数组的大小,恒等于数组中单个元素的大小乘以数组中元素的个数

    这也就是说,无论何时,计算数组的大小,都不会出现几个不相等的数相加的情况。

    如果你希望一个变量占用的内存空间等于其中各部分之和,可以这样写:

    #include <stdio.h>
    
    int main() {
      struct a {
        char a[5];
        char b[3];
        char c[8];
      } a = {"zzzz", "zz", "zzzzzzz"};
    
      printf("%lu\n", sizeof(a)); // 16 = 5 + 3 + 8
    }
    

    回复
    0
  • 取消回复