Вопрос:
Это основной вопрос, но я не смог найти окончательного ответа. Надеюсь, кто-то может пролить свет.
Я хочу знать, сколько пространства памяти занимает один массив.
Используют ли несколько массивов разных типов, но с одним и тем же объединенным размером байта, того же объема памяти?
Используется ли массив в том же пространстве памяти, что и несколько массивов с одинаковым размером?
Некоторые примеры:
(на моей системе 8051 микроконтроллер, char = 1 byte; int = 2 bytes ; float = 4 bytes;)
//case 1 char array_nr1[40]; //case 2 char array_nr1[10]; char array_nr2[10]; char array_nr3[10]; char array_nr4[10]; //case 3 int array_nr1[10]; int array_nr2[10]; //case 4 float array_nr1[10]; //case 5 char array_nr1[10]; int array_nr2[5]; float array_nr3[5];
Все ли 5 случаев занимают одинаковый объем памяти (40 байт)? Есть ли другие данные, которые хранятся в памяти (например, базовый адрес массива).
Спасибо.
Ответ №1
Память, занятая массивом, может быть получена с помощью оператора sizeof. Например
char array_nr1[40]; printf( «%zun», sizeof( array_nr1 ) );
Выход будет равен 40, потому что sizeof( char ), размер элемента которого гарантированно равен 1
Вы можете написать то же, например, для массива
int array_nr1[10];
Но было бы лучше рассчитать размер массива, умножив sizeof его элемента на числовое число элементов.
Итак, эта запись
sizeof( array_nr1 )
эквивалентно
10 * sizeof( int )
Итак, вопрос в том, что такое размер объекта типа int? Это зависит от реализации. Например sizeof (int) может быть равным 2 или 4 или некоторым другим значениям.
Итак, в вашем случае, если sizeof( int ) равно 2, то эти два массива
int array_nr1[10]; int array_nr2[10];
Занять 2 * ( 10 * sizeof( int ) ) = > 40 байт. Это тот же объем памяти, который занят массивом
char array_nr1[40];
Если sizeof( int ) равно 4, то массивы занимают разный объем памяти.
Такое же наблюдение допустимо для массивов типа float. Обычно размер в байтах объекта типа float равен 4. Поэтому, если sizeof( int ) равно 2, то эти массивы
char array_nr1[10]; int array_nr2[5]; float array_nr3[5];
occuoy тот же объем памяти, что и массив
char array_nr1[40];
потому что
10 * sizeof (char) + 5 * sizeof (int) + 5 * sizeof (float) = > 10 * 1 + 5 * 2 + 5 * 4 = > 40 байт.