The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]



"Копирование указателя и выделение памяти"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Копирование указателя и выделение памяти"  +/
Сообщение от datswdemail (?), 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"?

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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от datswdemail (?), 17-Сен-20, 21:02   +/
И что именно происходит, если сделать вот такЖ

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

    a = b;

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

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #5, #13

2. Сообщение от PavelR (??), 18-Сен-20, 09:26   +/
Используй указатель на указатель.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #3

3. Сообщение от datswdemail (?), 18-Сен-20, 14:38   +1 +/
> Используй указатель на указатель.

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

    char **a, *b;

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

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


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

Пасиб! :)

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2 Ответы: #4

4. Сообщение от ACCA (ok), 21-Сен-20, 04:30   –1 +/
Ты бы ещё взялся др*чить вприсядку. И на*шься и напляшешься. Просто думай, куда что ты суёшь:

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3 Ответы: #6

5. Сообщение от ACCA (ok), 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. Не?

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1 Ответы: #7

6. Сообщение от datswdemail (?), 21-Сен-20, 18:46   +/
Большое спасибо за комментарий.

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

Хммм....

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4 Ответы: #8

7. Сообщение от datswdemail (?), 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. Не?

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


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5

8. Сообщение от ACCA (ok), 23-Сен-20, 04:37   –1 +/
Ты опять ничего не понял. Вместо траха с указателем на указатель, тебе нужно было перенести присвоение значения переменной на момент, когда у неё появилось значение.

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


char *a, *b;
a = b;

когда ты присваиваешь одной неинициализированной переменной значение другой неинициализированной переменной. Про присядку ты в курсе.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #6 Ответы: #9

9. Сообщение от datswdemail (?), 23-Сен-20, 15:14   +/
Эххх....
Вы решили по кругу пройтись....
Прочитайте предыдущую поговорку. И в следующий раз, пожалуйста, имейте это в виду, чтобы какую-нибудь другую применить можно было :)

Ну да ладно.

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #8 Ответы: #10

10. Сообщение от datswdemail (?), 23-Сен-20, 15:39   +/
> "Я для чего это вам?"

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


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #9 Ответы: #11

11. Сообщение от Аноним (-), 29-Сен-20, 10:39   +/
Товаришь про присядку очень даже прав. Везде прямым текстом пишут - не надо вприсядку, указатели это весьма запутанная штука и без присядки легко сломать глаза, а если вприсядку так вообще . На лодошках поди уже щитина пробилась ?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #10

12. Сообщение от Ivanremail (?), 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)

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

Ответить | Правка | Наверх | Cообщить модератору

13. Сообщение от Ivanremail (?), 22-Ноя-20, 17:04   +/
> И что именно происходит, если сделать вот такЖ
>     char *a, *b;
>     b = malloc(1);
>     a = b;
>     a = realloc(a, 1000);
>     strcpy(a, ";aaa");
>     printf("%s", b);

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2020 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру