[英]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.