Вопросы:
-
Означает ли этот код ниже правила строгого сглаживания? То есть, интеллектуальному компилятору будет разрешено печатать
00000
(или какой-либо другой неприятный эффект), поскольку к нему сначала обращается буфер, к которому обращаются как к другому типу, черезint*
? -
Если это не так, будет перемещено только определение и инициализация
ptr2
перед фигурными скобками (так чтоptr2
будет уже определено, когдаptr1
попадет в область видимости) сломать его? -
Если это не так, удаляем скобки (так что
ptr1
иptr2
находятся в одной области) сломать его? -
Если да, как может быть исправлен код?
Бонусный вопрос: если код в порядке, а 2. или 3. не сломайте его, как изменить его, чтобы он нарушил строгие правила псевдонимов (например, конвертируйте скобку в цикл для использования int16_t
)?
int i;
void *buf = calloc(5, sizeof(int)); // buf initialized to 0
{
char *ptr1 = buf;
for(i = 0; i < 5*sizeof(int); ++i)
ptr1[i] = i;
}
int *ptr2 = buf;
for(i = 0; i < 5; ++i)
printf("%d", ptr2[i]);
Ищем подтверждение, поэтому короткий (ish), экспертный ответ об этом конкретном коде, в идеале с минимальными стандартными кавычками, является тем, чем я занимаюсь. Я не буду долго объяснять строгие правила псевдонимов, а только те части, которые относятся к этому коду. И было бы здорово, если бы ответ явно перечислил пронумерованные вопросы выше.
Также предположим, что ЦПУ общего назначения без целых значений ловушки, а также сказать, что int
- 32 бита и два дополнения.