Добро пожаловать в мир неопределенного поведения!
char *text = malloc(limit*4);
( не приводите malloc в C ) заставит text
указать первый элемент массива размераlimit*4
.
C не помешает вам писать после конца любого массива, просто поведение не определено стандартом. Он может нормально работать или сразу же аварийно завершить работу, или позже вы можете столкнуться с ненормальным поведением в программе.
Здесь базовый системный вызов, вероятно, выделил полную страницу памяти (часто 4 КБ), и, как вы это сделалине использовался другой malloc
, вы только что использовали память, принадлежащую процессу, но все еще официально не используется. Но не полагайтесь на это, и никогда не использует его в производственном коде.
И sizeof
не имеет смысла для указателей. sizeof(text)
равно sizeof(char *)
(то же самое для sizeof(++text)
по той же причине) и является размером указателя (обычно 2, 4 или 8 байт), а sizeof(*text)
равно sizeof(char)
, которое по определению равно 1.
C уверен, что вы как программист знаете, сколько памяти вы запросили, и не будете пытаться использовать больше. Все что угодно может произойти, если вы это сделаете (включая ожидаемый результат), но не вините язык или компилятор, если он сломается: только вы будете виновны.