|
|
||||||
Нужно ли очищать char * old value как?29.04.2019, 23:01. Показов 5128. Ответов 55
Метки нет (Все метки)
0
|
||||||
| 29.04.2019, 23:01 | |
|
Ответы с готовыми решениями:
55
Нужно ли очищать термопласту,если да то как? Нужно ли перед удалением контейнера очищать его? Класс list, когда нужно очищать память? |
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,318
|
||
| 03.05.2019, 03:46 | ||
NULL и символом конца строк \0 нет, и даже упоминать NULL в этом контексте - неправильно.
0
|
||
|
|
||||||||||||
| 03.05.2019, 20:14 [ТС] | ||||||||||||
|
сейчас я попытаюсь объяснить , поправьте меня плиз если я неправ в первом случае
во втором случае
непонятно другое. выше описаное повидение валидно только для нуля. если брать вторую ячейку то и в первом и вов тором варианте мы прекрасно печатаем mouse в консоль по p[2] и разименовывать указатель на не нужно
0
|
||||||||||||
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,318
|
||||||||||||
| 03.05.2019, 21:38 | ||||||||||||
|
Вот это
printf. Спецификатор %s требует аргумента-указателя, а вы передаете туда char (который превращается в int).И еще раз
0
|
||||||||||||
|
|
|
| 03.05.2019, 22:50 [ТС] | |
|
Я так печатать не собираюсь, это чисто для того чтоб увидить что там while видит. Только так видит(null) и только так он срабатывает.
А почему так нельзя это же не const литералы строк ? А простой дву мерный массив доступный для записи? Еще раз. Через p[2] mouse печатает для обоих вариантов. Но вот как условие для while p [i] не отрабатывает для двумерного массива.
0
|
|
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,318
|
||
| 04.05.2019, 01:07 | ||
|
Макрос NULL предназначен для использования только в указательных контекстах: для инициализации/присваивания указателей или для сравнения на равенство с указателями. Все. Больше NULL нигде применять нельзя.
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||||||||||||||||
| 04.05.2019, 04:05 | |||||||||||||||||
|
TheCalligrapher, и в настоящее время для указателей используется
nullptr, а NULL только для старых компиляторов, не поддерживающих С++11Добавлено через 16 минут alexbmd, вместо while (*pa[i])сделай
Кроме того, задавать размер массива с помощью числа считается дурным тоном (т.к. это число, как в коде выше, может потребоваться во многих местах, а через "правка - заменить всё" даже в небольшом проекте это делать будет неудобно). Задавай размер массива с помощью макроса или константной переменной. Например так, просто и ясно:
Добавлено через 10 минут
0
|
|||||||||||||||||
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,318
|
||||||||||||||||
| 04.05.2019, 05:28 | ||||||||||||||||
|
Я веду речь именно о том, что NULL теоретически может быть определен как nullptr и не будет работать ни в каком контексте, кроме указательных. Соответственно код автора вопроса может не компилироваться вообще.6*sizeof(char), когда классическая универсальная идиома
std::size, либо через вышеприведенный прием с sizeof p / sizeof *p.Это всегда было популярной альтернативной техникой, заменяющей заведение именованной константы. В большинстве случаев именованная константа мне нравится больше, но все равно не надо навязывать такие огульные заявления, как "задавать размер массива с помощью числа считается дурным тоном". Нет, не считается, если вы далее не повторяете эту константу. Более того, в ситуации, когда размер массива определяется в первую очередь количеством инициализаторов, именно предзадавать размер массива константой - дурной тон. Вот это - плохо: [] вместо [p_count], а только после этого сделать
1
|
||||||||||||||||
|
|
|||||||||
| 06.05.2019, 01:49 [ТС] | |||||||||
всеже не эквивалентно
вопрос 1) a) чем большев элементов, тем больше длину надо делать. вот для 4 элементов надо делать длину в 10 при том что все элементы могут быть 2 символа + 1 терминатор, всеравно надо делать 10 иначе на принт выводиться одна или более (в зависимости от комбинации) лишних строк с мусором. b) если добавить строку терминатора {"go", "cat", "mouse", "c", '\0'} то длину можно указать как и ожидается в 6 и будет работать правильно. пустую строку тоже не выводит. как и задумано. и тут всё понятно. почему же такое поведение как в пункте а ? вопрос 2) pa[i] имеет адрес начала каждого элемента, т.е. именно pa[i] (или *(pa+i) если кому то так привычнее) и только так способно вывести на принт весь элемент (или массив символов если кому так привычнее). В то время как *pa[i] выводит нулевой символ каждого элемента. Т.е. pa[i] адресс нулевого символа , *pa[i] сам символ. и вот while срабатывает только по символу. куда ведут адреса, что делает разименовывание это всё понятно. но вы вот говорите
Далее, если у нас такой массив как выше то pa[4] ведет на какойто адрес в памяти (мусор), и while (по адресу) не фейлится. тут с арифметикой все понятно. Но вот если у нас такой массив char *pa[] = {"go", "cat", "mouse", "c"}; то pa[4] ни куда не ведет (null) и соответсвено while нормально срабатывает по адресу. ПОЧЕМУ? ведь точно такаяже арифметика. неужели все дело в read-only memory?
0
|
|||||||||
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,318
|
||||||
| 06.05.2019, 02:09 | ||||||
|
Если вы хотите использовать цикл while (*pa[i]), то тогда обязательно потребуется дополнительный элемент массива с нулем в первом символе[CPP] char pa[][10] = {"go", "cat", "mouse", "с", ""}; char pa[][10] = {"go", "cat", "mouse", "с", 0}; char pa[5][10] = {"go", "cat", "mouse", "с"}; // и т.п. [CPP] Никакого 10 здесь не нужно. Второй размер в таком варианте должен быть достаточным для хранения самой длинной строки, т.е. 6 или более.В любом случае, pa[i] - это никакой не "адрес", а целый массив. Массив неявно приводится к указателю (адресу).https://www.cyberforum.ru/cpp-beginners/thread1941443.html#post10231882 Во-первых, pa[4] здесь никакой не (null), а мусор. В-вторых, этот массив состоит из указателей, а массив выше - из массивов, а не из указателей. "Арифметика" тут совершенно разная.
0
|
||||||
|
|
|||||||
| 08.05.2019, 15:01 [ТС] | |||||||
//далее было много букф но оказалось что *p[i] == *(*(p+i)) и вопросы отпали я по началу думал достаточно одного разименовывания.////на другом компиляторе оказалось что ноль нужен и в конце *pa[] и в конце pa[][] я по началу думал все компиляторы одинаковы полезны
0
|
|||||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||||||||||||||||||
| 08.05.2019, 15:25 | |||||||||||||||||||
Добавлено через 2 минуты А то что при отладке оно иногда срабатывает правильно - ну значит среди мусора в памяти оказалось достаточное число нулей, чтобы оказаться и в pa[4][0] Добавлено через 8 минут
*ptr и соответственно (*ptr)[1] и т.д.Добавлено через 4 минуты
0
|
|||||||||||||||||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||||||
| 08.05.2019, 16:47 | |||||||
0
|
|||||||
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,318
|
|||
| 08.05.2019, 17:22 | |||
p объявлено как двумерный массив, это не верно. p[i] - это сам массив, а не "адрес массива". p[i] имеет свойство преобразовываться в указатель (адрес), но это будет не "адрес всего массива", а адрес его нулевого элемента, т.е. &p[i][0].p[i]. Нет, то, что происходит в этом примере к исходному p[i] отношения не имеет.
0
|
|||
|
|
|||||
| 09.05.2019, 15:25 [ТС] | |||||
|
ptr++ == ptr +1 ptr +1 == pa[i++] т.е. мы прыгаем на адрес следующего массива i+1. просто он совпадает с нулевым элементом. Добавлено через 16 минут Кликните здесь для просмотра всего текста
[вообще страная тенденция, вроде некоторые форумчяне знают ответ но предпочитают молчать или уводят разговор в другое русло или смеются мол я ерунду говорю. а по сути я двигался в верном направлении но тогда понятно не хватало знаний. и знающий форумчянен напрмиер мог сказть третья память стэк или дать еще более развернутый ответ вместо того чтоб смеятся]
heap, const, stack но вообще их 5
0
|
|||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 09.05.2019, 15:35 | ||
|
0
|
||
| 09.05.2019, 15:35 | |
|
Как очищать TextOut(x,y)? Как очищать таблицу? Как правильно очищать память? Память освобождается, только если программа работает при char *c, а нужно при char c Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|