Переменная типа char *
является указателем (адресом памяти) на символ. В C принято реализовывать строки как символьные массивы с нулевым символом в конце и обрабатывать строки, используя переменные типа char *
для первого элемента такого массива.
Таким образом, переменные типа char *
на самом деле не содержит строк, они просто указывают на них.
По этой причине строка
s="hello";
фактически не копирует содержимое строка, а точнее только указатель (то есть адрес памяти) строки.
Если вы хотите скопировать фактическое содержимое строки, вы должны использовать вместо нее функцию strcpy .
Перезаписывая указатель, который вы используете для хранения адреса памяти, выделенной malloc
, вы вместо этого передаете адрес строкового литерала "hello"
в free
. Это не должно быть сделано. Вместо этого вы должны только передавать адреса памяти free
, которые вы получили от malloc
.