Зачем нам нужен strdup ()?

Пока я работал над заданием, я узнал, что мы не должны использовать назначения, такие как:

char *s="HELLO WORLD"; 

Программы, использующие такие синтаксисы, подвержены сбоям.

Я пробовал и использовал:

  int fun(char *temp) { // do sum operation on temp // print temp. } fun("HELLO WORLD"); 

Даже вышеизложенное работает (хотя выход является компилятором и стандартным).

Вместо этого мы должны попробовать strdup () или использовать const char *

Я пробовал читать другие подобные вопросы в блоге, но не мог понять, что ПОЧЕМУ ВЫШЕУКАЛЬНЫЙ КОД СЛЕДУЕТ РАБОТАТЬ.

Является ли выделенная память? И какая разница делает const?

Давайте немного проясним ситуацию. Вы никогда не нуждаетесь в strdup . Это просто функция, которая выделяет копию char* в куче. Это можно сделать разными способами, в том числе с буферами на основе стека. Вам нужен результат, изменяемая копия char* .

Причина того, что код, который вы указали, опасен, заключается в том, что он передает то, что на самом деле является постоянной строкой из строки литерала в слот, который ожидает изменчивую строку. Это, к сожалению, допускается в стандарте C, но опасно. Запись в постоянную строку приведет к неожиданным результатам и часто приводит к сбоям. Функция strdup исправляет проблему, потому что она создает изменяемую копию, которая помещается в слот, ожидающий изменчивую строку.

Строковые литералы хранятся в сегменте данных программы. Манипуляция их указателями изменит строковый литерал, что может привести к … странным результатам в лучшем случае. Используйте strdup() чтобы скопировать их в пространство с кучей или стеком.

Строковые литералы могут храниться в частях памяти, у которых нет привилегий записи. Попытка написать им приведет к неопределенному поведению. const означает, что компилятор гарантирует, что указатель не написан, гарантируя, что вы не вызываете неопределенное поведение таким образом.

Это проблема в C. Хотя строковые литералы char * вы не можете их модифицировать, поэтому они эффективно const char* .

Если вы используете gcc , вы можете использовать -Wwrite-strings чтобы проверить, правильно ли вы используете строковые литералы.

Прочтите мой ответ (array & string). Разница между Java и C. Он содержит ответ на ваш вопрос в разделе о строках.

Вы должны понимать, что существует разница между распределением статики и памяти и что вы не прибегаете к тем же пространствам памяти.