C如何在运行时找到数组的大小?关于数组大小或边界的信息存储在哪里?
lp0sw83n1#
sizeof(array)完全由C编译器实现。当程序被链接时,看起来像是对您的sizeof()调用的内容已经被转换为常量。例如:当你编译这段C代码时:
sizeof(array)
sizeof()
#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,它是一个真实的的函数。
$132
call sizeof
printf
bq8i3lrv2#
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标准允许实现对它视为常量的内容进行扩展)。
sizeof
n
1aaf6o9v3#
sizeof()只适用于固定大小的数组(可以是静态的,基于堆栈的或结构体中的)。如果你把它应用到一个用malloc(或C++中的new)创建的数组,你总是会得到一个指针的大小。是的,这是基于编译时信息的。
malloc
7fyelxc54#
sizeof给出的是变量的大小,而不是你所指向的对象的大小(如果有的话)。当且仅当arrayVar在作用域中被声明为数组而不是指针时,sizeof(arrayVar)将返回以字节为单位的数组大小。举例来说:
arrayVar
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)
字符串
gj3fmq9x5#
sizeof(Array)是在编译时查找的,而不是在运行时查找。不会储存信息。您可能对实现边界检查感兴趣吗?如果是这样的话,有很多不同的方法可以做到这一点。
5条答案
按热度按时间lp0sw83n1#
sizeof(array)
完全由C编译器实现。当程序被链接时,看起来像是对您的sizeof()
调用的内容已经被转换为常量。例如:当你编译这段C代码时:
字符串
你得到
型
中间的
$132
是数组的大小,132 = 4 * 33。注意,这里没有call sizeof
指令--不像printf
,它是一个真实的的函数。bq8i3lrv2#
sizeof是C++和C99之前的C中的纯编译时间。从C99开始,有可变长度数组:
字符串
这将计算
sizeof
操作数,因为n
在编译时还未知。这只适用于可变长度数组:其他操作数或类型仍然在编译时进行sizeof计算。特别是,在编译时已知维数的数组仍然像在C++和C89中一样处理。因此,sizeof
返回的值不再是编译时常量(常量表达式)。你不能在需要这样一个值的地方使用它-例如当初始化静态变量时,除非编译器特定的扩展允许它(C标准允许实现对它视为常量的内容进行扩展)。1aaf6o9v3#
sizeof()
只适用于固定大小的数组(可以是静态的,基于堆栈的或结构体中的)。如果你把它应用到一个用
malloc
(或C++中的new)创建的数组,你总是会得到一个指针的大小。是的,这是基于编译时信息的。
7fyelxc54#
sizeof
给出的是变量的大小,而不是你所指向的对象的大小(如果有的话)。当且仅当arrayVar
在作用域中被声明为数组而不是指针时,sizeof(arrayVar)
将返回以字节为单位的数组大小。举例来说:
字符串
gj3fmq9x5#
sizeof(Array)是在编译时查找的,而不是在运行时查找。不会储存信息。
您可能对实现边界检查感兴趣吗?如果是这样的话,有很多不同的方法可以做到这一点。