代码之家  ›  专栏  ›  技术社区  ›  marchinram

sizeof如何知道操作数数组的大小?

  •  30
  • marchinram  · 技术社区  · 15 年前

    12 回复  |  直到 15 年前
        1
  •  47
  •   bta    15 年前

    sizeof 在编译时进行解释,编译器知道数组是如何声明的(从而知道它占用了多少空间)。打电话 大小

        2
  •  23
  •   sbi    15 年前

    理解这一点的困难背后的问题可能是因为你混淆了数组和指针,就像很多人一样。然而, . A double da[10] 是十的数组 double ,不是 double* sizeof(da) . 编译器知道 sizeof(double) ?

        3
  •  14
  •   Jerry Coffin    12 年前

    sizeof 满的 对象的类型[编辑:不管怎样,它知道的关于对象类型的所有信息--如果类型不完整,因此不包括大小,则尝试使用 大小 将失败],以及 基本上只是将一段信息从编译器“导出”到正在编译的代码中,因此它在生成的代码中基本上成为一个常量。

    例外情况是 大小 应用于可变长度数组(VLA) . 当应用于VLA时, 大小


    1VLAs正式成为C99中C的一部分,但在此之前有些编译器支持它们。虽然不是C++的正式部分,但一些编译器(例如,G++)也将VLAS作为C++的扩展。

        4
  •  10
  •   David Rodríguez - dribeas    15 年前

    sizeof 只是请求编译器为您生成该值。

        5
  •  9
  •   Billy ONeal IS4    15 年前

    Sizeof 是编译时运算符;它具有与编译器相同的信息。(显然是编译器

    sizeof 在指针上,您得到的是指针的宽度,而不是该指针所指向的数组的大小。

        6
  •  5
  •   ngroot    15 年前

    与这里的其他答案相反,请注意,从C99开始,sizeof()是 必须在编译时确定,因为数组可能是可变长度的。

        7
  •  3
  •   Mark Ransom    15 年前

    sizeof 在局部变量上,它知道您声明了多少元素。如果你用的是 大小 给出指针的大小。

        8
  •  2
  •   karlphillip    15 年前

    wiki :

    这是政府的责任 编译器的作者来实现 对于给定的实现是正确的 语言。运算符的大小 必须考虑 基础设施的实施 内存分配方案,以获得 通常是编译时运算符 意味着在编译过程中,sizeof 它的操作数被 C语言产生的汇编语言代码 虽然它的使用有时看起来像是 函数调用。

        9
  •  2
  •   stacker    15 年前

    这个 sizeof operator “知道”所有原子数据类型的大小,因为结构、联合和数组只能通过组装原子类型来构造,所以很容易确定任何类型数组的大小。它使用基本算法来确定复杂类型(在编译时)。

        10
  •  2
  •   dreamlax    15 年前

    sizeof 在编译时计算。值得注意的例外是C99的可变长度数组。

    int main(int argc, char **argv)
    {
        if (argc > 1)
        {
            int count = atoi(argv[1]);
            int someArray[count];
    
            printf("The size is %zu bytes\n", sizeof someArray);
        }
        else puts("No");
    }
    
        11
  •  1
  •   user432579    15 年前

    Sizeof总是在编译时计算的。在多道编译器生成符号表时,编译器必须确定每个符号的大小,才能进一步生成中间代码。因此,对于所有sizeof reference,代码中的值都将替换确切的值。在中间代码生成阶段,所有运算符、语句都转换为正确的中间代码(ASM/其他格式)。最后,在m/c代码生成阶段将其转换为机器代码。

    上面的一些讨论与sizeof有关的动态分配根本不在上下文中。任何对size(*p)的引用,其中p是任何数据类型的指针,编译器只是找出*p的数据类型并替换其大小,而不是检查分配块的MCB头以查看分配的内存大小。它不是在运行时。例如,double*p;sizeof(*p)仍然可以在不为指针p分配任何内存的情况下完成。这怎么可能呢?

        12
  •  1
  •   Prudhvi Krishna Surapaneni    13 年前

    sizeof在编译时计算。这就是为什么在创建动态数组时,要按以下方式创建它。

    char * array;
    int size;
    //Get size somehow.
    array = malloc(size*(sizeof(char)));
    

    //现在在编译过程中,编译器可以确定char的大小。因为它必须在内存上对齐它们。在这一点上,操作系统知道需要分配多少大小。

    可变长度数组 另一方面是在 . 但是任何malloc分配的内存都会在堆上创建。