Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2018, 18:17   #1
FerrariF70
Пользователь
 
Регистрация: 05.09.2017
Сообщений: 21
По умолчанию C выделение памяти под строку

Здравствуйте у меня вопрос на засыпку
можно ли выделить память под указатель на строку realloc или malloc или с указателем на строку нельзя ничего делать кроме как читать

вот пример:
Код:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>

char *string(char *, const char*);

int main(void)
{
	char *dst = "Hello ";
	char *src = "World";
	string(&dst, src);
	printf("%s", dst);
	return 0;
}
char *string(char **dst, char *src)
{
        int size = strlen(src);

	while(*dst++);
        *dst = (char*) realloc(sizeof(char) * (size + 1));
	while (*dst++ = *src++);
	
	return *dst;

}
FerrariF70 вне форума Ответить с цитированием
Старый 30.03.2018, 18:45   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Нельзя ничего делать кроме как читать.
Ничто не мешает выделить *новый* блок памяти и скопировать строку туда. Именно так работает strdup().
waleri вне форума Ответить с цитированием
Старый 30.03.2018, 22:20   #3
FerrariF70
Пользователь
 
Регистрация: 05.09.2017
Сообщений: 21
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Нельзя ничего делать кроме как читать.
Ничто не мешает выделить *новый* блок памяти и скопировать строку туда. Именно так работает strdup().
strdup() работает с malloc а это значит новый кусок памяти. но у меня ситуация совсем иначе у меня два указателя на две строки я хотел скопировать из src в dst и в моём случае должно было получится dst = "Hello World"
FerrariF70 вне форума Ответить с цитированием
Старый 30.03.2018, 23:11   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А зачем копировать?
Присвойте указатель и все:
dst = src;
waleri вне форума Ответить с цитированием
Старый 31.03.2018, 01:43   #5
FerrariF70
Пользователь
 
Регистрация: 05.09.2017
Сообщений: 21
По умолчанию

Тогда я просто заменю строку. Нет не возможно сделать ничего с указателем на строку всё перепробовал. realloc не позволяет делать, а malloc переопределяет память и строка исчезает. только с вспомогательным указателем можно соединить две строки.
FerrariF70 вне форума Ответить с цитированием
Старый 31.03.2018, 13:54   #6
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Это вообще не полностью верно
Код:
char *dst = "Hello ";
char *src = "World";
Верно сделать
Код:
const char *dst = "Hello ";
const char *src = "World";
Тогда вам становится ясно, почему эта память только чтение. Дело в том, что эта память выделена при компиляции в теле программы. Т.о., скажем на линуксе, попытки ее менять немедленно уронят программу.
Для ваших манипуляцяций необходимо выделять память в процессе работы через malloc и в нее уже копировать че угодно.

Такое поведение компилятора позволяет экономить, например, если у вас в коде будет 20 раз "Hello ", то компилятор сделает всего 1 копию, а везде использует указатель на нее (это задается ключами компиляции). Или вы программируете дрон - тогда эти "Hello " вообще окажутся в постоянной памяти, которую нельзя изменить вне завода в полете. Т.о. вобщем то, что вы пытаетесь делать не корректно, можно применять в узком случае написания вирусов/защит для винды (а на линуксе/маке все равно не заработает).

Последний раз редактировалось alexzk; 31.03.2018 в 14:07.
alexzk вне форума Ответить с цитированием
Старый 31.03.2018, 18:25   #7
FerrariF70
Пользователь
 
Регистрация: 05.09.2017
Сообщений: 21
По умолчанию

Спасибо то что и ожидал услышать. По этому и спросил если возможна такая вещь.
FerrariF70 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение памяти под приложение. Nikolay2015 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 10.12.2017 21:42
Выделение памяти под матрицу yakimechik Общие вопросы C/C++ 1 22.01.2016 08:33
Динмическое выделение памяти под строку retrix147 Общие вопросы C/C++ 9 25.09.2013 17:54
Выделение памяти под структуру. Си Vitany Помощь студентам 0 05.12.2012 17:50
выделение памяти под массив на C Kingdom_Reborn Помощь студентам 12 12.01.2011 04:40