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

C sizeof计算运行时,编译时

  •  0
  • fnclovers  · 技术社区  · 7 年前

    enter image description here

    我认为指针大小可以在编译时计算,因为您应该在编译时指定32位编译或64位编译。

    但在这种情况下,为什么要在运行时计算sizeof呢?

    https://en.wikipedia.org/wiki/Sizeof

    在维基百科中,Sigeof在运行时计算灵活数组,编译时间最多。

    2 回复  |  直到 7 年前
        1
  •  2
  •   dbush    7 年前

    在这两种情况下 sizeof 在编译时已知。在第一种情况下,它的大小是 int * 在第二种情况下,它的大小是 int 长度为10的数组。

    幻灯片似乎认为 尺寸 在第一种情况下,将给您分配的内存量,但这不是真的。用户必须跟踪分配了多少空间,以确保不超过界限。

    唯一一次 尺寸 在运行时为可变长度数组计算,例如:

    int x = foo();
    int arr[x];
    printf("size=%zu\n", sizeof(arr));
    

    此行为由 C standard 以下内容:

    这个 尺寸 运算符生成其 操作数,可以是表达式或 键入。大小由操作数的类型决定。这个 结果是一个整数。如果操作数的类型是可变长度 数组类型,则计算操作数;否则,不计算操作数 结果是一个整数常量。

        2
  •  -1
  •   Andreas Wenzel    7 年前

    是的,指针的大小也可以在编译时确定,而不仅仅是在运行时。

    我认为这意味着,在第一种情况下,x表示的int数组的大小(即x指向的)只能在运行时确定,因为它是从对malloc的调用(即动态内存分配)返回的。然而,这种措辞似乎仍然不合适,因为malloc是用一个在编译时已知的常量值调用的。不过,sizeof操作员并不知道这一点。它只返回指针本身的大小。