Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3

Нужно ли очищать char * old value как?

29.04.2019, 23:01. Показов 5057. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>
#include <stdio.h>
 
 
int main()
{
     long adr=1;
 char * str1, *str2;
 
 
str1 = "Hello1";
printf ("&str1 = %d ",&str1); 
adr = (long)str1;
 
printf ("&hello1 = %d ",adr); 
 
str2 = (char*)adr;
//free (str1);
 
str1 = "new string";
printf ("\n");
printf ("str1 = %s ",str1);
printf ("str2 = %s ",str2);
}
изучая стринги, решил проверить что происходит со старым значением указателя. незнаю правильно ли проверил, но вроде старое значение Hello1 получается так и висит в памяти. как его удалить ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.04.2019, 23:01
Ответы с готовыми решениями:

Нужно ли очищать термопласту,если да то как?
Вообщем после сборке ПК,походу заляпал разъём видюхи и материнки термопластой.Картинки есть.Видео есть- вроде в норме.Вообщем может...

Нужно ли перед удалением контейнера очищать его?
Нужно ли перед удалением контейнера очищать его или в деструкторе по умолчанию вызывается метод clear()?

Класс list, когда нужно очищать память?
не могу разобраться когда нужно очищать память &quot;delete input_&quot; и почему каждый раз выделяя помять у меня один и ттот же адрес ...

55
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.05.2019, 19:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alexbmd Посмотреть сообщение
или так
УМВР.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
01.05.2019, 19:37  [ТС]
Валерий и другие господа книжки я читаю. не из головы же все эти вопросы. но я понимаю дали бы конкретный линк на конкретный раздел книжки.... т.к. например я пока читал про char * [] два десятка книжек открыл и нигде про это не слово, из форумов по крупицам собирал инфу.
так же мне непонятно возмущение и нервный тон, как еслиб я в разде для профи зашёл и сморозил фигню
добрее надо быть

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
УМВР.
в вашем компиляторе тоже работает. или к чему этот линк ?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.05.2019, 19:39
Цитата Сообщение от alexbmd Посмотреть сообщение
в вашем компиляторе тоже работает. или к чему этот линк ?
У меня gcc и стоит. Другой вопрос что он плюется варнингами на char* вместо const char*.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
01.05.2019, 19:49
Цитата Сообщение от alexbmd Посмотреть сообщение
или так
C
1
2
3
4
5
int i = 0;
while (pa[i])
{
printf("*pa[%d] = %c\n", i , *pa[i]+i); i++;
}
а если так?
C++
1
2
3
4
5
int i = 0;
while (pa[i])
{
printf("*pa[%d] = %c\n", i , *pa[i]); i++;
}
Цитата Сообщение от alexbmd Посмотреть сообщение
так же мне непонятно возмущение и нервный тон,
да где ж ты увидел нервный тон
Цитата Сообщение от alexbmd Посмотреть сообщение
добрее надо быть
абсолютно согласен

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
а если так?
пардон, запутался совсем, одну ошибку увидел а остальные пропустил
вот так

C++
1
2
3
4
5
6
7
8
9
int main()
{
    char *pa[] = {"123","456","789", NULL};
    int i = 0;
    while (pa[i])
    {
        printf("pa[%d] = %s\n", i , pa[i]); i++;
    }
}
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
01.05.2019, 19:59  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
а если так?
у вас тоже работает. но немного по другому. выводя всю строку. у меня только один символ.

Нужно ли очищать char * old value как? тут у меня оба варианта рабочие.
на радостях забыл указать что это рабочие варианты.

спасибо всем! пока вопрос нет!

после экспериментов с lvalue , если возникнут вопросы обращюсь еще
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,542
Записей в блоге: 1
01.05.2019, 20:01
Цитата Сообщение от ValeryS Посмотреть сообщение
да где ж ты увидел нервный тон
да у меня был нервный тон и я извиняюсь за свой тон и за свои нервы, но так уж получается, что каждый меряет по себе. Когда у меня было мало знаний и я учил С++ я почему-то не пытался героически придумывать себе проблемы "а как удалить строку из памяти". И уж тем более чего-то доизобретать за создателей языка. Мне училка в школе давала задачу - я её решал, не задумываясь над вопросами мирозданья, мне автор в книжке писал "как надо" - я так и делал.

Война с ветряными мельницами, которую ни я, ни кто -либо ещё себе не придумывали, меня действительно заставляет отбивать фейспалмы, за что я и извиняюсь.
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
01.05.2019, 20:05
Цитата Сообщение от alexbmd Посмотреть сообщение
у вас тоже работает. но немного по другому. выводя всю строку. у меня только один символ.
вот именно
а почему один символ?
да потому что так задано
Цитата Сообщение от alexbmd Посмотреть сообщение
printf("*pa[%d] = %c\n", i , *pa[i]+i); i++;
%c вывести символ, а я выводил строку %s
да и с адресацией несколько напутано
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
02.05.2019, 14:44  [ТС]


прошу прощения, всетаки у меня там неправильно было. просто вывод совпал с ожиданием и я не заметил подвоха

оказывается смещая указатель +2 , компилятор не внутри [i] строки перемещает его а просто конвертирует char в int+2 и выводит символ принадлежащий этому коду... [ я знаю что чар это по сути инт просто незнал как понятнее объяснить ]
C++
1
2
3
4
5
6
7
char *pa[] = {"dog", "cat", "mouse", NULL};
 
int i = 0;
while (pa[i])
{
printf("*pa[%d] = %c\n", i , *pa[i]+2); i++;
}
вообщем. а я то хотел вывести буквы 'g', 't', 'u'
как можно это сделать ?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2019, 14:49
alexbmd,
C++
1
printf("*pa[%d] = %c\n", i, pa[i++][2]);
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
02.05.2019, 16:07  [ТС]
отжеж, а я пробовал
C++
1
*pa[i++][2]
и цветок не получался спасибо

ок, массив указателей, ожидаемо срабатывает на NULL, почему двумерный массив строк не отрабатывает NULL а продолжает печатать всё что в оперативки без разбору ?
C++
1
2
3
4
5
6
7
char pa[][9] = {"dog", "cat", "mouse", NULL};
 
int i = 0;
while (pa[i])
{
    printf("*pa[%d] = %s\n", i , pa[i++]);
}
вроде pa[3] == NULL, почему нет ?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2019, 16:15
Цитата Сообщение от alexbmd Посмотреть сообщение
почему двумерный массив строк не отрабатывает NULL а продолжает печатать всё что в оперативки без разбору ?
потому что он одномерный по сути, и четвертая строка просто пустая

Добавлено через 2 минуты
вот условие:
C++
1
while (i < std::size(pa))
Добавлено через 1 минуту
или конкретно для вашего массива:
C++
1
while (*pa[i])
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
02.05.2019, 19:00  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
while (*pa[i])
да оно так правильно отрабатывает,

но чтото я немного запутался
в случае char *pa[] = {"dog", "cat", "mouse"}; pa у нас хранит адрес первого чара, а *pa выдает нам значение по этому адресу, и когда мы проверяем while (pa[i]), мы проверяем есть ли адресс у pa[i] и когда до ходим до момента что там нет адреса то while фейлится, так?


а вот в случае char pa[][8] = {"dog", "cat", "mouse"}; у нас двумерный массив, который по сути одномерный, pa[i] у нас и так хранит значение а не указатель , то что мы проверяем в while (*pa[i]), значение на значение, что это такое?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2019, 19:12
Цитата Сообщение от alexbmd Посмотреть сообщение
pa[i] у нас и так хранит значение а не указатель
не хранит, а вычисляет адрес нужного байта в массиве(в вашем случае pa+i*8)
Цитата Сообщение от alexbmd Посмотреть сообщение
то что мы проверяем в while (*pa[i]), значение на значение, что это такое?
эта проверка была для массива, в котором последняя строка была NULL, для того что вы сейчас написали это не прокатит
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
02.05.2019, 19:20  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
эта проверка была для массива, в котором последняя строка была NULL
объясните пожалуйста для массива где последний NULL ?
если pa[i] на самом деле тоже хранит адресс а не значение как я думал то получается *pa[i] мы проверяем есть ли значение ? странно тогда почему оно срабатывает и без NULL

PS: хотя оно так тоже работает , без последнего NULL , но из ваших слов понимаю что видно не во всех компиляторах/оптимизациях этот трюк пройдет
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2019, 19:40
Возьмите лучше книжку почитайте

только там снизу не значение адреса, а значение по адресу (разыменованый указатель)
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2019, 20:14

ошибочка, pa[3] == 0, он никуда не указывает
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
02.05.2019, 20:18  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
только там снизу не значение адреса, а значение по адресу
куда у нас стучиться pa[2][2] или любой другой индекс. это я понимаю. тут вопросов еще до С.

вопрос куда стучиться *pa[i] в случае простого двумерного массива ? вот это загадка. но которая почему то правильно отрабатывается в while (*pa[i]) на нахождение конца массива
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2019, 20:34
на втором рисунке не корректно, у меня там приращение в байтах, а нужно приращение в размерах указателя, т. е.
*pa == pa[0]; *(pa + 1) == pa[1]; и т.д. Ну и сами строки в памяти как правило не компактно располагаются если их размер больше 4 байт

Добавлено через 3 минуты
Цитата Сообщение от alexbmd Посмотреть сообщение
*pa[i]
это не корректное выражение, оно эквивалентно pa[0][i]
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
02.05.2019, 20:56
Цитата Сообщение от alexbmd Посмотреть сообщение
ок, массив указателей, ожидаемо срабатывает на NULL, почему двумерный массив строк не отрабатывает NULL а продолжает печатать всё что в оперативки без разбору ?
C++
1
char pa[][9] = {"dog", "cat", "mouse", NULL};
Это в общем случае не компилируемо вообще. Вам просто случайно повезло, что на вашей платформе оказалось, что NULL - это просто 0. В результате получилось

C++
1
char pa[][9] = {"dog", "cat", "mouse", 0};
Такой 0 по правилам обработки агрегатных инициализаторов выступил в роли инициализатора для pa[3][0]. Все остальные элементы этого массива тоже просто обнулились. То есть ваше объявление эквивалентно

C++
1
char pa[][9] = {"dog", "cat", "mouse", { 0 }};

Цитата Сообщение от alexbmd Посмотреть сообщение
вроде pa[3] == NULL, почему нет ?
pa[3] никак не может быть равно NULL. pa[3] - это реально существующий массив типа char[9]. Адрес существующего объекта никак не может равняться нулевому указателю.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
02.05.2019, 21:45
alexbmd, строки char * в С и С++ отличаются тем, что конец строки отмечается символом '\0', который соответствует значению 0 (или NULL, если речь об одном из макросов в С). При этом строка может размещаться на участке памяти, выделенном с запасом.

А массивы вообще (в том числе те же самые char *, если их рассматривать не как строки, а просто как массивы) никаким таким свойством не обладают, и никаких NULLов у них нет (если элемент массива содержит 0 или начинается с 0 то это ничего не значит).

По двумерным массивам - http://cppstudio.com/post/389/

По адресной арифметике (именно касательно того что означает *pa[i]) http://proguroki.ru/urok7/urok... arifmetika https://metanit.com/cpp/tutorial/4.3.php https://habr.com/ru/post/251091/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.05.2019, 21:45

Нужно ли очищать память, выделенную под вектор?
Доброго времени суток. При работе с динамическими массивами всегда чистил память оператором delete. Нужно ли делать тоже самое с векторами,...

Как очищать TextOut(x,y)?
Привет всем. Подскажите, как очищать TextOut(x,y)? При нажатии кнопки текст выводиться на image1 по координатам например (10,10), а при...

Как очищать таблицу?
Суть: Если в таблице больше 10 строк, то удалять самую раннюю строку, то есть которая была добавлена раньше всех остальных десяти. ...

Как правильно очищать память?
Как правильно очищать память? char *filePath; // инициализируется в другом участке кода. ... char *fileNameChar; ...

Память освобождается, только если программа работает при char *c, а нужно при char c
С клавиатуры вводится символьная строка (предложение), размещается в памяти, выводится в том же виде, память освобождается, работает при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru