Как c найти во время выполнения размер массива? где хранится информация о размере или границах массива?
Как работает sizeof (Array)
Ответ 1
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
, которая является реальной функцией.
Ответ 2
sizeof - это чисто время компиляции в С++ и C до C99. Начиная с 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 во время компиляции. В частности, массивы с размерами, известными во время компиляции, все еще обрабатываются, как в С++ и C89. Как следствие, значение, возвращаемое sizeof
, больше не является константой времени компиляции (константное выражение). Вы не можете использовать его там, где это значение необходимо - например, при инициализации статических переменных, если только это не допускает расширение для компилятора (стандарт C допускает, чтобы реализация имела расширения к тому, что она рассматривает как постоянную).
Ответ 3
sizeof()
будет работать только для массива фиксированного размера (который может быть статическим, основанным на стеке или в структуре).
Если вы примените его к массиву, созданному с помощью malloc
(или нового в С++), вы всегда получите размер указателя.
И да, это основано на информации времени компиляции.
Ответ 4
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)
Ответ 5
sizeof (Array) просматривается во время компиляции, а не во время выполнения. Информация не сохраняется.
Возможно, вам интересно провести проверку границ? Если это так, есть несколько разных способов сделать это.