繁体   English   中英

sizeof(Array) 是如何工作的

[英]How Does sizeof(Array) work

c 如何在运行时找到数组的大小? 有关数组大小或数组边界的信息存储在哪里?

sizeof(array)完全由 C 编译器实现。 当程序被链接时,看起来像是对您的sizeof()调用已转换为常量。

示例:当您编译此 C 代码时:

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
    int a[33];
    printf("%d\n", sizeof(a));
}

你得到

    .file   "sz.c"
    .section        .rodata
.LC0:
    .string "%d\n"
    .text
.globl main
    .type   main, @function
main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    subl    $164, %esp
    movl    $132, 4(%esp)
    movl    $.LC0, (%esp)
    call    printf
    addl    $164, %esp
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
    ret
    .size   main, .-main
    .ident  "GCC: (GNU) 4.1.2 (Gentoo 4.1.2 p1.1)"
    .section        .note.GNU-stack,"",@progbits

中间的$132是数组的大小,132 = 4 * 33。请注意,没有call sizeof指令 - 与printf不同,后者是真正的 function。

sizeof 是 C99 之前的 C++ 和 C 中的纯编译时间。 从 C99 开始有可变长度 arrays:

// returns n + 3
int f(int n) {
    char v[n + 3];

    // not purely a compile time construct anymore
    return sizeof v;
}

这将评估sizeof操作数,因为n在编译时还不知道。 适用于可变长度 arrays:其他操作数或类型仍然在编译时计算 sizeof。 特别是,在编译时已知尺寸的 arrays 仍然像在 C++ 和 C89 中一样处理。 因此, sizeof返回的值不再是编译时常量(常量表达式)。 你不能在需要这样一个值的地方使用它——例如在初始化 static 变量时,除非编译器特定的扩展允许它(C 标准允许实现对它视为常量的内容进行扩展)。

sizeof()仅适用于固定大小的数组(可以是 static,基于堆栈或在结构中)。

如果将其应用于使用malloc (或 C++ 中的新功能)创建的数组,您将始终获得指针的大小。

是的,这是基于编译时间信息。

sizeof给出变量的大小,而不是您指向的 object 的大小(如果有的话)。当且仅当arrayVar在 scope 中声明为数组时, sizeof(arrayVar)才会返回以字节为单位的数组大小而不是指针。

例如:

char myArray[10];
char* myPtr = myArray;

printf("%d\n", sizeof(myArray)) // prints 10 
printf("%d\n", sizeof(myPtr)); // prints 4 (on a 32-bit machine)

sizeof(Array) 在编译时查找,而不是在运行时查找。 不存储信息。

您是否对实施边界检查感兴趣? 如果是这样,有许多不同的方法来 go 关于那个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM