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

Другое решение, если кто-то получает ошибку Указанный пароль для учетной записи пользователя «root» недействителен или не удалось подключиться к серверу базы данных также с правильным паролем, это следовать за

• В реестре Windows удалите ключ реестра mysql_pwd в разделе HKCU \ Software \ Microsoft \ WebPlatformInstaller

• Unistall более старая версия соединителя MySQL .NET

• Загрузите и установите последний MySql .NET Connector .

48
задан Kazoom 22 March 2009 в 23:31
поделиться

5 ответов

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, который является реальной функцией.

63
ответ дан Rob Kennedy 23 March 2009 в 09:31
поделиться

sizeof (Массив) ищется во время компиляции, не во время выполнения. Информация не хранится.

Вы, возможно, Интересуются реализацией проверки границ? Если так, существует много различных способов пойти об этом.

2
ответ дан ysth 23 March 2009 в 09:31
поделиться

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)
6
ответ дан Dan Breslau 23 March 2009 в 09:31
поделиться
  • 1
    Когда Вы говорите " [...] директива ng-модели по тому же элементу получает тот изолированный объем также. Что означает, что у Вас есть два различных объема, которые являются not' t подключенный к каждому other" если тот же изолированный объем совместно используется и ng-model и contenteditable, каким образом тогда Вы говорите, что у них есть два различных объема? Это похоже на противоречие. Или я пропускаю что-то? – Behrang 13 January 2014 в 12:20

sizeof() будет только работать на массив фиксированного размера (который может быть статичным, базирующийся стек или в структуре).

при применении его к массиву, созданному с malloc (или новый в C++) Вы будете всегда получать размер указателя.

И да, это основано на информации о времени компиляции.

8
ответ дан Delimitry 23 March 2009 в 09:31
поделиться

sizeof является чистым временем компиляции в C++ и 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 вычислить во время компиляции. В частности, массивы с размерами, известными во время компиляции, все еще обрабатываются как в C++ и C89. Как следствие значение, возвращенное sizeof, не является временем компиляции, постоянным (константное выражение) больше. Вы не можете использовать его, где такое значение требуется - например, при инициализации статических переменных, если компилятор, который определенное расширение позволяет ему (Стандарт C позволяет реализации иметь расширения того, что это рассматривает как постоянное).

18
ответ дан Johannes Schaub - litb 23 March 2009 в 09:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: