Подтвердить что ты не робот

Как работает sizeof (Array)

Как c найти во время выполнения размер массива? где хранится информация о размере или границах массива?

4b9b3361

Ответ 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) просматривается во время компиляции, а не во время выполнения. Информация не сохраняется.

Возможно, вам интересно провести проверку границ? Если это так, есть несколько разных способов сделать это.