Вы присваиваете строковый литерал - строки «Правильное написание» / «Неправильное написание» - указателю sub
, а затем пытаетесь освободить его с помощью free()
.Строковые литералы размещаются в коде статически и не могут быть освобождены.
По сути, указатель sub
во время вызова free()
указывает на то, что не было выделено с malloc()
.
Я думаю, что главная проблема заключается в том, что вы выполняете присваивание указателя, когда вы, вероятно, хотите сделать строку copy , чтобы содержимое строки находилось в той области, из которой вы получилиmalloc()
.
РЕДАКТИРОВАНИЕ:
Возможно, вы захотите взглянуть на функции strcpy()
и strdup()
.strcpy()
было бы хорошо в вашем случае, хотя было бы лучше, если бы вы привыкли к strncpy()
вместо этого.
strdup()
- это, примерно, комбинация strlen() + malloc() + strcpy()
и, как правило, наиболее простой вариант, когда вы хотите получить копию строки в областях динамической памяти, чтобы впоследствии ее можно было освободить с помощью free()
.
РЕДАКТИРОВАТЬ 2:
В приведенном выше коде вы используете буфер sub
только для ответных сообщений, а затем освобождаете его.Если это будет последним поведением вашего кода, вы можете просто удалить вызовы malloc()
и free()
, и это, вероятно, будет хорошо.