簡體   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