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

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

11 голосов
/ 02 ноября 2010

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

 char *s="HELLO WORLD";

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

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

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

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

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

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

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

Ответы [ 5 ]

15 голосов
/ 02 ноября 2010

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

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

4 голосов
/ 02 ноября 2010

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

3 голосов
/ 02 ноября 2010

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

1 голос
/ 02 ноября 2010

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

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

0 голосов
/ 02 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...