Как sizeof может определить точный размер структуры в памяти, если объект этой структуры не был создан? - PullRequest
1 голос
/ 02 февраля 2020

Я столкнулся с проблемой, определив размер структуры. Я обнаружил, что можно определить размер структуры с помощью предшествующего ключевого слова struct внутри операции sizeof, хотя для соответствующей структуры не было создано ни одного объекта:

Пример:

#include <stdio.h>

int main()
{
   struct struct1
   {
        char a[20];
        int v,i;
        double grw;
   };

   printf("Size of struct1 in Byte: %lu",sizeof(struct struct1));

   return 0;
}

Вывод:

Size of struct1 in Byte: 40

Как это возможно?

Как можно sizeof определить размер структуры с помощью struct Ключевое слово внутри sizeof-операции, если ни один объект этой структуры не был создан?

Или был создан struct1 объект, о котором я не знал?

Я думал структура - это только тип данных, но не объект своего собственного типа.

Ответы [ 2 ]

3 голосов
/ 02 февраля 2020

За исключением массивов переменной длины, sizeof не требуется экземпляр типа для определения его размера, он может работать с ним только на основании самого определения типа.

В случае, если вы дадите (показано ниже), он на самом деле знает только из определения этого типа, насколько большим будет объект (размер каждого отдельного поля плюс любой отступ, необходимый для выравнивания между каждым полем и после последнего поля) - комментарии дают одну возможность:

struct struct1 {
    char a[20];  // 20 bytes @ 0.
    int v,i;     // Two 4-byte values @ 20 (a multiple of 4, so already aligned).
                 // 4 bytes padding to align next 8-byte double.
    double grw;  // 8 bytes @ 32 (a multiple of 8, aligned due to padding above).
};
1 голос
/ 02 февраля 2020

sizeof должен иметь возможность определять размер различных типов, иначе он не будет знать, сколько места выделять, когда вам это нужно.

Определение struct указывает, сколько места будет использоваться.

Одно распределение может быть таким:

  • char a[20]: 20 байтов.
  • int c, i: 16 бит каждый, поэтому 4 байта .
  • double grw: 128 бит, то есть 16 байтов.

Всего: 40 байтов

...