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