Есть несколько проблем с вашей программой:
- Поскольку вы используете
malloc()
и free()
, вы должны выполнить #include <stdlib.h>
перед вызовом любой из этих функций.
- Нет необходимости приводить возвращаемое значение из
malloc()
: оно возвращает void *
, которое можно безопасно назначить любому другому типу указателя (кроме указателей на функции). Итак, вы можете сделать: p = malloc(10);
- Когда вы освобождаете указатель, выделенный с помощью
malloc()
или realloc()
, использование значения указателя каким-либо образом является плохим: в частности, вы не можете вызвать free()
для него снова.
int main()
лучше записать как int main(void)
.
- Поскольку
main()
возвращает int
, вы должны вернуть значение из него. Традиционно 0 означает успех.
Конечно, главная (без каламбура) проблема с вашей программой многократно освобождает ее, но важны и другие проблемы, упомянутые выше. После того, как вы free()
успешно указали, вызов free()
для него является неопределенным поведением: программа может делать все что угодно, включая (к сожалению), , похоже, ничего плохого не делает . Я говорю «к сожалению», потому что это может дать вам чувство безопасности, что можно free()
указатель более одного раза.