c如何在运行时找到数组的大小?有关数组大小或存储数组范围的信息在哪里?
答案 0 :(得分:60)
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
不同,这是一个真正的函数。< / p>
答案 1 :(得分:17)
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标准允许实现具有对它所处理的常量的扩展)。
答案 2 :(得分:8)
sizeof()
仅适用于固定大小的数组(可以是静态的,基于堆栈的,也可以是结构中的数组)。
如果将它应用于使用malloc
创建的数组(或C ++中的新数组),您将始终获得指针的大小。
是的,这是基于编译时信息。
答案 3 :(得分:6)
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)
答案 4 :(得分:2)
sizeof(Array)在编译时查找,而不是在运行时查找。信息未存储。
您是否对实施边界检查感兴趣?如果是这样,有很多不同的方法可以解决这个问题。