Си: итерация через указатель

Прошу понять: я не профессиональный программист, занимаюсь этим в качестве хобби. Так что где ещё спрашивать, как не здесь.

Если в Си выделить под указатель несколько блоков памяти соответствующего размера,

int* pointer = malloc(sizeof(int) * 5);

то к ним можно обращаться на манер индекса в массиве:

pointer[3] = 10;

Как-то раз я решил попробовать, можно ли провести итерацию через указатель и подсчитать количество элементов в нём?

int i = 0;
while(pointer[i]) i++;

К моему удивлению, ошибки сегментации не произошло, и после прохождения выделенных блоков памяти цикл благополучно прервался. Подсчёт прошёл корректно. Нормально ли это или же просто совпадение? Практикуется ли такое? Или это такая защитная функция gcc от "экспериментаторов" вроде меня? Я помню, например, как в ВУЗовском учебнике "С/С++" авторы создавали целый двунаправленный список с указателями на прошлый и следующий элементы, которым присваивался NULL, чтобы указать, что дальше выделенных объектов нет. Также ещё можно выделить блоков памяти на один больше нужного, и присвоить последнему NULL, и тогда при итерации цикл также будет безопасно прерываться. Но можно ли вообще вот так вслепую итерироваться по указателю, пусть у него и инициализированы все элементы?


Ответы (0 шт):