Использование исходной строки - будь то литерал в источнике, часть файла с отображением памяти или даже выделенная строка, принадлежащая другой части вашей программы, - имеет преимущество сохранения памяти и, возможно, устранения которые вы в противном случае должны были бы обработать, если бы вы выполнили распределение (которое может потерпеть неудачу). Недостатком, конечно же, является то, что вы должны следить за тем, что эта строка не «принадлежит» используемым в настоящее время кодом и, следовательно, ее нельзя изменить/освободить. Иногда это означает, что вам нужен флаг в структуре, чтобы указать, была ли выделена строка, которую она использует, для структуры или нет. С меньшими программами это может означать, что вы должны вручную следовать логике владения строками через несколько функций и убедиться, что это правильно.
Кстати, если строка будет использоваться структурой, один хороший способ обойтись, чтобы иметь флаг, обозначающий, был ли он выделен для структуры или нет, - это выделить пространство для структуры и строка (если необходимо) с одним вызовом до malloc
. Затем освобождение структуры всегда просто работает, независимо от того, была ли строка выделена для структуры или назначена из строкового литерала или другого источника.
Ни преимущество, ни недостаток, но 'str2' должен почти наверняка будет объявлен 'const char *'. И если вы хотите модифицируемую короткую строку, 'char str1 [] =" some string ";' хорошо. –