Проходя через несколько вопросов на собеседовании с C, я нашел вопрос о том, как найти размер массива в C без использования оператора sizeof, со следующим решением. Это работает, но я не могу понять, почему.
#include <stdio.h>
int main() {
int a[] = {100, 200, 300, 400, 500};
int size = 0;
size = *(&a + 1) - a;
printf("%d\n", size);
return 0;
}
Как и ожидалось, возвращается 5.
редактировать: люди указали на этот ответ, но синтаксис немного отличается, то есть метод индексации
size = (&arr)[1] - arr;
поэтому я считаю, что оба вопроса верны и имеют несколько иной подход к проблеме. Спасибо всем за огромную помощь и подробное объяснение!
*((*(&array + 1)) - 1)
безопасно использовать , чтобы получить последний элемент автоматического массива? , tl; dr *(&a + 1)
вызывает неопределенное поведение
(ptr)[x]
такие же, как *((ptr) + x)
.
&a + 1
не указывается ни на один действительный объект, поэтому он недействителен.