2013-02-19 2 views
0
#include <stdio.h> 

#define SIZE 10 

typedef struct dynArrStruct 
{ 
    double value1; 
    int value2; 
    int value3; 
}dynArr; 

int main(int argc, char** argv) 
{ 
    dynArr a1[SIZE]; 
    dynArr* a2[SIZE]; 
    printf("Size of a1 array: %d\n", sizeof(a1)); 
    printf("Size of a2 array: %d\n", sizeof(a2)); 
    return 0; 
} 

Первые распечатывает 160.sizeof моего массива структуры разные ... почему?

Второй печатает 40.

я цифра 4 байта на элемент и есть 10 элементов для 2-го. Но я не могу понять, почему у первого есть 160.

Спасибо.

+1

Вы можете распечатать 'sizeof (double)' и 'sizeof (int)' и добавить их. – timrau

+0

Откуда у вас возникла идея, что размер элемента будет равен 4? Попробуйте распечатать 'sizeof (dynArr)'. –

ответ

14

a1 - массив структур, a2 - это массив указателей структур.


a1 состоит из SIZE (10) структур, изложены последовательно в памяти.

----------- ----------- ------- ----------- ----------- 
| struct0 | | struct1 | | ... | | struct8 | | struct9 | 
----------- ----------- ------- ----------- ----------- 

Ее размер составляет SIZE * sizeof(dynArr) = 10 * 16 = 160

Почему 16 байт на структуры?

typedef struct dynArrStruct 
{ 
    double value1; // sizeof(double) = 8 
    int value2; // sizeof(int) = 4 
    int value3; // sizeof(int) = 4 
} dynArr; 

сочти тех, и у вас есть 16 байт. (Может быть даже больше, чем сумма индивидуальных размеров в зависимости от заполнения)


a2 состоит из SIZE (10) указателей, структур, изложенных в памяти последовательно. Его размер равен SIZE * sizeof(dynArr*) = 10 * 4 = 40

Почему 4 байта на указатель?

Это размер указателя на большинстве 32-битных систем.

1

Заданного по вашей платформе, что

typedef struct dynArrStruct 
{ 
    double value1; /* 8 Bytes */ 
    int value2;  /* 4 bytes */ 
    int value3;  /* 4 Bytes */ 
}dynArr; 

и что нет обивки байт между элементами структуры.

Затем, размер структуры будет составлять 16 байт, так что 16 * 10 = 160

0

a1 в вашем случае массив структур. Сама структура имеет размер 16 байтов (double - 8 байт, int - 4 байт), и вы получаете размер 160 байт.

a2 это массив указателей. Размер одного указателя составляет 4 байта (из-за вашей 32-разрядной системы), и поэтому вы получаете общий размер 40 байт.

Следует помнить, что a2 не инициализирован. Таким образом, на самом деле он не содержит ваших структур, он просто удерживает некоторое пространство, если вы можете хранить указатели на свою структуру.

Смежные вопросы