LINUX.ORG.RU

передача указателя по ссылке


0

1

Нужна помощь в подобрании такого вот аналога для С в функции выделяется память и указазатель возвращается на эту память На С++ так:

void my_new(char *&str)

{

str = new char[256];

str = «Hello Hello from new»;

}

вообщем чем бы так удачней заменить char *&str, или только один вариант через char **str ?



Последнее исправление: espero (всего исправлений: 1)

>только один вариант через char **str ?

А зачем другой вариант, если этот работает?

gentoo_root ★★★★★
()
char *my_new(){
    car *str =  strdup("Hello Hello from new");
    return str;
}

Или

char *my_new(char **ptr){
    *ptr =  strdup("Hello Hello from new");
    return ptr;
}
Второй вариант позволяет проверять, не было ли ошибок выделения памяти ( if(my_new(&str))... )

Eddy_Em ☆☆☆☆☆
()

> str = new char[256];
> str = «Hello Hello from new»;

сожгите этого гражданина на костре, пожалуйста.

arsi ★★★★★
()

>>str = «Hello Hello from new»;

хочется взять и уе^Wзаставить перечитать мурзилку по C

exception13 ★★★★★
()

Прочитал первую главу учебника по си - не стесняйся, переходи ко второй.

Что касается кода - страх и ужас. Делай как Eddy_Em.

jeyc
()

Глядя на это начинаешь понимать лавсана и vsl'я.

aedeph
()

ну ё маё, я это же как пример написал. Цель задачи передать по ссылке указатель, С компилёр ругается func.c|51|error: expected ';', ',' or ')' before '&' token| а передовать через указатель на указатель муторно, вот спрашиваю есть какието обходные пути

espero
() автор топика

Во-первых что на С, что С++ таки нужен return если действительно хочется именно ВОЗВРАТИТЬ что-то. То что написано у тебя - хреновенький стиль. Нормальная практика - передавать в функцию уже выделенный блок памяти. Это снимает неоднозначности. Во-вторых, ты хочешь вернуть массив char, зачем тебе char** ? Ну и man malloc/calloc есссно ))

cathode
()
Ответ на: комментарий от espero

>> С компилёр ругается func.c|51|error: expected ';', ',' or ')' before '&'

Потому, что в С нет передачи по ссылке. Там нельзя void f(char& x) {}. Только через указатель: void f(char* x) {..} предварительно сделав char* t = (char*) malloc (...) и потом f(t). Ферштейн?

cathode
()
Ответ на: комментарий от cathode

Слона таки и не заметил, попробую через return. В моём случае в функция должна вернуть указатель на динамически выделенный блок памяти, причем размер этого блока вычисляется в функции , и узнать каким он будет нет возможности. И получается если мы передаем в функцию указатель в виде char*, который должен будет указывать на выделенный блок памяти, то будет облом, так как при выделении памяти изменяется адрес, а его изменить нельзя, а вот значение можно, поэтому и приходится либо через char** либо char*& , но С-ный компилятор на второй способ ругается

espero
() автор топика
Ответ на: комментарий от espero

либо char*& , но С-ный компилятор на второй способ ругается

Потому что это - способ из «плюсов».

Вот пример функции, изменяющей указатель из аргументов:

ssize_t mygetline(char **buffer, int fd){
	size_t bufportion = 16000, bufsz = bufportion, i = 0;
	free(*buffer); *buffer = NULL;
	char *ptr;
	char *buf;
	buf = malloc(bufsz);
	ptr = buf;
	if(read(fd, ptr, 1) != 1){ free(buf); return -1; }
	do{
		if(*ptr == '\n') break;
		ptr++;
		if(++i >= bufsz){
			bufsz += bufportion;
			buf = realloc(buf, bufsz);
			ptr = &buf[i];
		}
	}while(read(fd, ptr, 1) == 1);
	*ptr = 0;
	*buffer = strdup(buf);
	free(buf);
	return i;
}

Eddy_Em ☆☆☆☆☆
()

Ну, ссылки - это те же пойнтеры, вид сбоку. Внутрях реализуются одинаково. Так что прямой перевод на C - именно что char**.

Miguel ★★★★★
()

Мне показалось, что вы хотите strdup().

Deleted
()
Ответ на: комментарий от damnemall

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

g-71
()
Ответ на: комментарий от Eddy_Em

Второй вариант позволяет проверять

а первый чем не позволяет? Так же, если вернулся нулевой указатель то значит strdup зафейлил.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Я просто не так выразился. Сравните с

void my_new(char **ptr){
    *ptr =  strdup("Hello Hello from new");
}

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.