当前位置:  开发笔记 > 编程语言 > 正文

sizeof(Array)如何工作?

如何解决《sizeof(Array)如何工作?》经验,为你挑选了4个好方法。

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



1> David Z..:

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

示例:编译此C代码时:

#include 
#include 
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,这是一个真正的功能.



2> Johannes Sch..:

sizeof是C++之前的纯编译时间和C99之前的C. 从C99开始,有可变长度数组:

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

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

这将评估sizeof操作数,因为n在编译时尚不知道.这适用于可变长度数组:其他操作数或类型仍然在编译时使sizeof计算.特别是,在编译时已知维度的数组仍然像C++和C89一样处理.因此,返回的值sizeof不再是编译时常量(常量表达式).您不能在需要这样的值的地方使用它 - 例如,在初始化静态变量时,除非编译器特定的扩展允许它(C标准允许实现具有对它所处理的常量的扩展).


很高兴您提到C99 VLA.但是,您的答案应该强调,即使在C99中,固定大小的数组在编译时也会计算它们的大小 - 只有VLA在运行时计算其大小.也许,因此,你不能总是在C99中使用'sizeof(array)'作为常量.

3> Henk Holterm..:

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

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

是的,这是基于编译时信息.


您已经忘记了C99 VLA - 可变长度阵列.

4> Dan Breslau..:

sizeof给出变量的大小,而不是你指向的对象的大小(如果有的话.)sizeof(arrayVar)将以字节为单位返回数组大小,当且仅当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)

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有