URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10325
[ Назад ]

Исходное сообщение
"Копирование указателя и выделение памяти"

Отправлено datswd , 17-Сен-20 20:48 
Всем привет!

Есть два указателя

char *a, *b;

Потом мы делаем

a = b
a = malloc(100);
strcpy(a, "lolo");
printf("%s", b);


Когда делается malloc связка между a и b теряется. И printf выводит null.

Можно ли как-нибудь сделать так, чтобы связка между указателями не терялась и printf выводил "lolo"?

Заранее благодарен.


Содержание

Сообщения в этом обсуждении
"Копирование указателя и выделение памяти"
Отправлено datswd , 17-Сен-20 21:02 
И что именно происходит, если сделать вот такЖ

    char *a, *b;
    b = malloc(1);

    a = b;

    a = realloc(a, 1000);
    strcpy(a, ";aaa");
    printf("%s", b);


"Копирование указателя и выделение памяти"
Отправлено ACCA , 21-Сен-20 04:49 
> И что именно происходит, если сделать вот такЖ
>     char *a, *b;
>     b = malloc(1);
>     a = b;
>     a = realloc(a, 1000);
>     strcpy(a, ";aaa");
>     printf("%s", b);

Сильно лучше и даже заработает, но нафига тебе realloc?
Ты уж сразу определись, чего ты хочешь. Сэкономишь realloc=malloc+memcpy+memfree. Не?


"Копирование указателя и выделение памяти"
Отправлено datswd , 22-Сен-20 19:46 
>> И что именно происходит, если сделать вот такЖ
>>     char *a, *b;
>>     b = malloc(1);
>>     a = b;
>>     a = realloc(a, 1000);
>>     strcpy(a, ";aaa");
>>     printf("%s", b);
> Сильно лучше и даже заработает, но нафига тебе realloc?
> Ты уж сразу определись, чего ты хочешь. Сэкономишь realloc=malloc+memcpy+memfree. Не?

Насчет заработает - далеко не факт.
Если будет в текущем расположении блока достаточно места, чтобы просто его расширить, то да, заработает.
А если места будет не достаточно, то указатель переедет на другое место и ничего не заработает.



"Копирование указателя и выделение памяти"
Отправлено Ivanr , 22-Ноя-20 17:04 
> И что именно происходит, если сделать вот такЖ
>     char *a, *b;
>     b = malloc(1);
>     a = b;
>     a = realloc(a, 1000);
>     strcpy(a, ";aaa");
>     printf("%s", b);

Тут у тебя как повезет, реаллок может вернуть старый указатель, а может новый, но писать на авось это плохо


"Копирование указателя и выделение памяти"
Отправлено PavelR , 18-Сен-20 09:26 
Используй указатель на указатель.

"Копирование указателя и выделение памяти"
Отправлено datswd , 18-Сен-20 14:38 
> Используй указатель на указатель.

Вот что получилось

    char **a, *b;

    a = &b;
    *a = malloc(100);

    strcpy(*a, "some string");
    printf("b=%s\n", b);
    printf("a=%s", *a);


Шикааааарно.

Пасиб! :)


"Копирование указателя и выделение памяти"
Отправлено ACCA , 21-Сен-20 04:30 
Ты бы ещё взялся др*чить вприсядку. И на*шься и напляшешься. Просто думай, куда что ты суёшь:

a = malloc(100);
b = a;
strcpy(a, "lolo");
printf("%s", b);


"Копирование указателя и выделение памяти"
Отправлено datswd , 21-Сен-20 18:46 
Большое спасибо за комментарий.

Ваш комментарий - идеальная иллюстрация поговорки: "Слышал звон, да не знает где он"

Хммм....

А что если вы продолжите в том же духе?
Можно попробовать сделать справочник поговорок. Только модератора нужно будет попросить вынести это в отдельную тему :)


"Копирование указателя и выделение памяти"
Отправлено ACCA , 23-Сен-20 04:37 
Ты опять ничего не понял. Вместо траха с указателем на указатель, тебе нужно было перенести присвоение значения переменной на момент, когда у неё появилось значение.

А не писать ерунду вроде


char *a, *b;
a = b;

когда ты присваиваешь одной неинициализированной переменной значение другой неинициализированной переменной. Про присядку ты в курсе.

"Копирование указателя и выделение памяти"
Отправлено datswd , 23-Сен-20 15:14 
Эххх....
Вы решили по кругу пройтись....
Прочитайте предыдущую поговорку. И в следующий раз, пожалуйста, имейте это в виду, чтобы какую-нибудь другую применить можно было :)

Ну да ладно.

Задача как раз и стоит в том, чтобы связка не терялась ни при malloc, ни при realloc. То есть чтобы оставался линк на указатель даже после изменения области памяти, на которую он указывает.

Бедненький....
Сходите на какой-нибудь тренинг по общению с людьми...
Вместо того, чтобы просто спросить: "Я для чего это вам?", вы пишете какие-то странные вещи....


"Копирование указателя и выделение памяти"
Отправлено datswd , 23-Сен-20 15:39 
> "Я для чего это вам?"

*"А для чего это вам?"



"Копирование указателя и выделение памяти"
Отправлено Аноним , 29-Сен-20 10:39 
Товаришь про присядку очень даже прав. Везде прямым текстом пишут - не надо вприсядку, указатели это весьма запутанная штука и без присядки легко сломать глаза, а если вприсядку так вообще . На лодошках поди уже щитина пробилась ?

"Копирование указателя и выделение памяти"
Отправлено Ivanr , 22-Ноя-20 16:58 
>[оверквотинг удален]
> Потом мы делаем
> a = b
> a = malloc(100);
> strcpy(a, "lolo");
> printf("%s", b);
> Когда делается malloc связка между a и b теряется. И printf выводит
> null.
> Можно ли как-нибудь сделать так, чтобы связка между указателями не терялась и
> printf выводил "lolo"?
> Заранее благодарен.

Когда выполняется следующая команда:
a = malloc(100)

То значение, ранее содержащееся в переменной а заменяется тем, что вернул маллок