char *str = malloc(0);
Правильно ли я понимаю, что в str находится начало выделянно памяти на 0 байт
Вот что говорит стандарт (c99, 7.20.3:1) о выделении 0 байт через malloc:
If the size of the space requested is zero, the behavior is implementation-
defined: either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.
Поскольку твоё обращение к этой памяти не вызывает SEGFAULT, то да, malloc вернул не NULL. Сколько байт реально было выделено зависит от реализации.
а дальше идет запись символов в память, которая для нас не предназначалась?
Да. Использовать эту память согласно стандарту нельзя.