Как уже отмечали другие, это UB. Ваше наблюдение за кодом, «работающим» в том смысле, что оно не вызывает segfault или подобного, является более или менее случайным. Ваше распределение другой переменной в стеке может измениться , где ваш указатель c выделен, и, таким образом, он может иметь другое (случайное) место, на которое он указывает. (Или, иначе говоря, его начальное случайное значение будет или может быть другим).
Наблюдаемое различное поведение программы в зависимости от того, где и какие (независимые) объекты размещены внутри функции, является полной ошибкой в том, что с функцией выделения памяти в функции что-то не так.