61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
1

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

29.04.2019, 23:01. Показов 2452. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2019, 23:01
Ответы с готовыми решениями:

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

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

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

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

55
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
01.05.2019, 19:35 21
Цитата Сообщение от alexbmd Посмотреть сообщение
или так
УМВР.
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
01.05.2019, 19:37  [ТС] 22
Валерий и другие господа книжки я читаю. не из головы же все эти вопросы. но я понимаю дали бы конкретный линк на конкретный раздел книжки.... т.к. например я пока читал про char * [] два десятка книжек открыл и нигде про это не слово, из форумов по крупицам собирал инфу.
так же мне непонятно возмущение и нервный тон, как еслиб я в разде для профи зашёл и сморозил фигню
добрее надо быть

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
УМВР.
в вашем компиляторе тоже работает. или к чему этот линк ?
0
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
01.05.2019, 19:39 23
Цитата Сообщение от alexbmd Посмотреть сообщение
в вашем компиляторе тоже работает. или к чему этот линк ?
У меня gcc и стоит. Другой вопрос что он плюется варнингами на char* вместо const char*.
0
Модератор
Эксперт по электронике
8695 / 6493 / 879
Регистрация: 14.02.2011
Сообщений: 22,716
01.05.2019, 19:49 24
Цитата Сообщение от 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
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
01.05.2019, 19:59  [ТС] 25
Цитата Сообщение от ValeryS Посмотреть сообщение
а если так?
у вас тоже работает. но немного по другому. выводя всю строку. у меня только один символ.

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

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

после экспериментов с lvalue , если возникнут вопросы обращюсь еще
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,026
Записей в блоге: 1
01.05.2019, 20:01 26
Цитата Сообщение от ValeryS Посмотреть сообщение
да где ж ты увидел нервный тон
да у меня был нервный тон и я извиняюсь за свой тон и за свои нервы, но так уж получается, что каждый меряет по себе. Когда у меня было мало знаний и я учил С++ я почему-то не пытался героически придумывать себе проблемы "а как удалить строку из памяти". И уж тем более чего-то доизобретать за создателей языка. Мне училка в школе давала задачу - я её решал, не задумываясь над вопросами мирозданья, мне автор в книжке писал "как надо" - я так и делал.

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


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

оказывается смещая указатель +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
5232 / 2886 / 1208
Регистрация: 07.02.2019
Сообщений: 7,283
02.05.2019, 14:49 29
alexbmd,
C++
1
printf("*pa[%d] = %c\n", i, pa[i++][2]);
1
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
02.05.2019, 16:07  [ТС] 30
отжеж, а я пробовал
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
5232 / 2886 / 1208
Регистрация: 07.02.2019
Сообщений: 7,283
02.05.2019, 16:15 31
Цитата Сообщение от alexbmd Посмотреть сообщение
почему двумерный массив строк не отрабатывает NULL а продолжает печатать всё что в оперативки без разбору ?
потому что он одномерный по сути, и четвертая строка просто пустая

Добавлено через 2 минуты
вот условие:
C++
1
while (i < std::size(pa))
Добавлено через 1 минуту
или конкретно для вашего массива:
C++
1
while (*pa[i])
1
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
02.05.2019, 19:00  [ТС] 32
Цитата Сообщение от 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
5232 / 2886 / 1208
Регистрация: 07.02.2019
Сообщений: 7,283
02.05.2019, 19:12 33
Цитата Сообщение от alexbmd Посмотреть сообщение
pa[i] у нас и так хранит значение а не указатель
не хранит, а вычисляет адрес нужного байта в массиве(в вашем случае pa+i*8)
Цитата Сообщение от alexbmd Посмотреть сообщение
то что мы проверяем в while (*pa[i]), значение на значение, что это такое?
эта проверка была для массива, в котором последняя строка была NULL, для того что вы сейчас написали это не прокатит
0
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 294
Записей в блоге: 2
02.05.2019, 19:20  [ТС] 34
Цитата Сообщение от zayats80888 Посмотреть сообщение
эта проверка была для массива, в котором последняя строка была NULL
объясните пожалуйста для массива где последний NULL ?
если pa[i] на самом деле тоже хранит адресс а не значение как я думал то получается *pa[i] мы проверяем есть ли значение ? странно тогда почему оно срабатывает и без NULL

PS: хотя оно так тоже работает , без последнего NULL , но из ваших слов понимаю что видно не во всех компиляторах/оптимизациях этот трюк пройдет
0
5232 / 2886 / 1208
Регистрация: 07.02.2019
Сообщений: 7,283
02.05.2019, 19:40 35
Возьмите лучше книжку почитайте
Нужно ли очищать char * old value как?

только там снизу не значение адреса, а значение по адресу (разыменованый указатель)
0
5232 / 2886 / 1208
Регистрация: 07.02.2019
Сообщений: 7,283
02.05.2019, 20:14 36
Нужно ли очищать char * old value как?

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

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

Добавлено через 3 минуты
Цитата Сообщение от alexbmd Посмотреть сообщение
*pa[i]
это не корректное выражение, оно эквивалентно pa[0][i]
0
С чаем беда...
Эксперт CЭксперт С++
9989 / 5341 / 1461
Регистрация: 18.10.2014
Сообщений: 12,854
02.05.2019, 20:56 39
Цитата Сообщение от 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
зомбяк
1562 / 1211 / 344
Регистрация: 14.05.2017
Сообщений: 3,925
02.05.2019, 21:45 40
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2019, 21:45
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru