Как перераспределить память для строки только для чтения?

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

Это мой код, и он вызывает сбой на Aborted (core dumped):

char *my_str = "Hello World";
my_str = realloc(my_str, 50);

-Можете ли вы помочь мне понять, почему он падает?

-Есть ли стандартный/элегантный способ скопировать исходную строку в динамическую память, кроме приведенного ниже? Для меня очень важно использовать realloc(), а не malloc() + memcpy()

int len = strlen(my_str);
char *new_str = (char*)malloc(len + 1);
memcpy(new_str, my_str, len + 1);

person SomethingSomething    schedule 30.04.2014    source источник
comment
Вы не можете realloc постоянную строку. Вам нужно будет скопировать его и изменить это.   -  person Mgetz    schedule 01.05.2014
comment
Фундаментальное правило realloc: только realloc то, что изначально было mallocd. Вы нарушаете это правило. Если вам больно, когда вы это делаете, не делайте этого.   -  person Eric Lippert    schedule 01.05.2014
comment
@ShafikYaghmour: я знаю. И это также может быть указатель, который был callocd. Давайте не будем больше путать проблему с неясными деталями, когда пользователь еще не знает основ.   -  person Eric Lippert    schedule 01.05.2014
comment
Почему бы не написать эти комментарии как ответы и не поставить этому вопросу более высокую оценку? Вам не кажется, что хорошо, если другие программисты увидят, что этот вариант использования невозможен?   -  person SomethingSomething    schedule 01.05.2014
comment
@EricLippert конечно, но это не только для OP, это должно быть для всех, кто читает вопрос.   -  person Shafik Yaghmour    schedule 01.05.2014
comment
Возможно, связано: Являются ли строковые литералы константными?   -  person Jongware    schedule 01.05.2014
comment
@user3322273 user3322273 Вы написали, что для меня действительно важно использовать realloc(), а не malloc() + memcpy() Почему???   -  person Jiminion    schedule 01.05.2014
comment
Ничего, я удаляю этот пост. Это действительно невозможно и бесполезно. РЕДАКТИРОВАТЬ: ой, не могу удалить это :)   -  person SomethingSomething    schedule 01.05.2014
comment
Удивительно, сколько неправильных ответов вызывает такой простой вопрос...   -  person Ed S.    schedule 01.05.2014
comment
@EricLippert: Вы можете правильно realloc все, что создано malloc, calloc, realloc и strdup, но не alloca. Есть ли другие функции?   -  person abelenky    schedule 01.05.2014
comment
Видимо есть еще asprintf и vasprintf... а может и больше?   -  person abelenky    schedule 01.05.2014


Ответы (1)


Код вопроса:

char *my_str = "Hello World";

назначает указатель 'my_str' для указания на статическую строку, которая не является частью "кучи", из которой выделена память. Только память, выделенная из «кучи», может быть изменена с помощью «realloc()» или в конечном итоге возвращена в кучу с помощью «free()»;

Если заменить код на:

char *my_str = strdup("Hello World");

Теперь указатель «my_str» указывает на память, выделенную из кучи, и ее размер можно изменить, как указано в коде вопроса:

my_str = realloc(my_str, 50);

Не забудьте освободить эту выделенную память, когда она больше не нужна:

free(my_str);
person Mahonri Moriancumer    schedule 30.04.2014
comment
Кратко и хорошо изложено. - person ryyker; 01.05.2014
comment
+1, но я бы добавил к этому: поскольку у OP были некоторые трудности с концепцией кучи памяти, стоит явно указать, что теперь указатель должен быть free()d. - person Kennet Belenky; 01.05.2014
comment
@KennetBelenky, спасибо. Я отредактирую это. - person Mahonri Moriancumer; 01.05.2014