Как рассчитать общую потребность в памяти для массива структуры в C? - PullRequest
0 голосов
/ 06 апреля 2020

Предположим, что целому числу требуется 4 байта, действительному числу нужно 4 байта, а символу требуется 1 байт памяти для выделения. Рассмотрим следующее определение для хранения 15-дневной дневной температуры в 5 городах.

struct monYear
{
    int month, year;
};
struct perCity
{
    char cityName[16];
    struct monYear my;
    float temperature[31];
    float avrg;
} fiveCities[5][15];

Каков общий объем памяти для переменной массива fiveCities (сколько байт она занимает в памяти)?

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Структура, которую вы указали, проста и может быть легко рассчитана как

(16+4+4+31*4+4)*5*15=11400 B

(я полагаю, что int равен 4B, что является спецификацией архитектуры c)

Однако упаковка структуры не всегда прямолинейный, и, например, тот же размер генерируется, когда cityName изменяется на 15 элементов.

Это зависит от компилятора и архитектуры, одно из лучших руководств по упаковке структуры можно найти здесь :

http://www.catb.org/esr/structure-packing/

Мы используем оператор sizeof, чтобы избежать путаницы при упаковке конструкций, как показано в примере ниже.

#include <stdio.h>

struct monYear {
  int month, year;
};
struct perCity {
  char cityName[15];
  struct monYear my;
  float temperature[31];
  float avrg;
} fiveCities[5][15];

int main(void) {
  printf("%zu\n", sizeof(fiveCities));
  return 0;
}

Там это опция для принудительного использования компилятором указанного c размера упаковки, например, g cc имеет пакет #pragma:

#pragma pack(1)
struct test_structure {
  char byte[1];
  uint32_t dword;
};
#pragma pack()

Обычно это не рекомендуется, но в некоторых случаях может быть полезно , В приведенном выше примере размер структуры составляет 5 байтов, тогда как без #pragma pack это будет 8.

1 голос
/ 06 апреля 2020

Вы можете использовать sizeof оператор. Вы можете использовать sizeof(fiveCities), что равно 5*15*sizeof(struct perCity).

0 голосов
/ 08 апреля 2020

Как пояснение, sizeof является оператором, а не функцией и не требует скобок при поиске размера значения. Скобки нужны только тогда, когда вы хотите найти размер типа (вроде как приведение). Таким образом, в вашем примере вы можете найти свой размер либо:

size_t my_size = sizeof fiveCities;

, либо вы можете использовать

#define CITIES 5
#define YEARS  15
size_t storage_needed = sizeof(struct perCity) * CITIES * YEARS;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...