Я написал программу C для отображения значений массива с помощью указателя. Вот код:Содержит ли n-й индекс массива размера n размера?
#include <stdio.h>
int main()
{
int a[] = {1, 1, 1, 1, 1};
int *ptr = a;
for (int i = 0 ; i < 5; i++)
printf("%d ", *ptr++);
printf("%d", *ptr);
}
Как вы можете видеть, после завершения цикла, указатель содержит адрес памяти значения из массива. Поскольку он, то есть последний выход не инициализирован, он должен быть значением мусора. Но каждый раз он показывает 5, размер массива. Затем я подумал, что следующий адрес памяти выделенной памяти для массива содержит размер массива. Но этого не происходит с массивом двойного типа.
Output for int array : 1 1 1 1 1 5
Output for double array : 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 0.000000
Кто-нибудь объяснит выход?
Вы используете i ++, поэтому ptr указывает на область памяти в вашей программе вне массива a. Поскольку вы перекомпилировали для перехода от int к double, я не могу сделать вывод, почему в одном случае вы получаете 5, а в другом случае - ноль. Как double, так и int хранятся как 4 байта, а double - число с плавающей запятой IEEE 488. – jdweng
@jdweng: 1) нет никакого смысла в дальнейшем исследовании неопределенного поведения. 2) double требует не менее 64 бит, т. Е. 8 октетов (если ваши байты не имеют 16 бит, что было бы вполне корректно), проверьте CHAR_BIT) 3) Что такое IEEE488? Обычно C использует плавучую точку IEC 60559 (aka IEEE754). Никогда не заголовок о стандарте, который вы упомянули. Можете ли вы предоставить ссылку? – Olaf
«* Это должно быть значение для мусора *» - это ** ** значение мусора. * «Но каждый раз, когда он показывает 5, который является размером массива. * '-' 5' - мусор. У мусора нет необходимости иметь другое значение каждый раз, когда вы его смотрите, казалось бы, мусор все еще мусор –