Невозможно определить, используете ли вы строковый литерал (ну, вы можете поместить строковые литералы в пользовательский раздел .se, созданный GCC, а затем проверить указатель строки, чтобы определить, содержится ли он в разделе .sese ofлитералы).Однако ... есть более простой способ использования простого шаблона программирования.
Распределение с помощью литерала
Нормальный случай.Вызов free (req) будет работать как положено: освободить структуру запроса.
struct *req;
req = malloc(sizeof(*req));
req->message = "TEST";
Распределение с помощью динамической строки
Далее some_string
- это строка, которую вы хотите сохранитькак сообщение запроса.Это может быть как литерал, так и динамически размещенный.Это выделяет память для строки при выделении самой структуры (и будет освобождаться автоматически при освобождении структуры).
struct *req;
req = malloc(sizeof(*req)+strlen(some_string)+1);
req->message = (char *)&req[1];
strcpy(req->message, some_string);
Освобождение
free(req);
Редактирование: Общий случай
Обратите внимание, что приведенная выше схема выделения для dynamic string
является общей, ее можно использовать, даже если вы не знаете, является ли some_string
литералом или нет.Таким образом, единственная функция, которая обрабатывает оба случая и освобождает с помощью free()
, освобождает вас от особых случаев.