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

Почему поинтер обнуляется ?

30.04.2019, 02:01. Показов 8009. Ответов 118
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>
 
 
int main()
{
 char* p = (char*)malloc(strlen("Thunderbird") + 1);
  strcpy(p, "Thunderbird");
for ( ; *p; ++p) if(*p > 'Z') {continue;} else if (*p < 'A') {continue;} else {*p = *p|0x60;}
 
printf ("str3 = %s ",p);
}
почему for обнуляет вместо того чтобы присвоить ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.04.2019, 02:01
Ответы с готовыми решениями:

Почему все обнуляется???
#include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; // прототипы функций void input ( float , char); void raschet ( float , float ,...

Почему мой указатель обнуляется?
Почему мой указатель обнуляется на какой-то итерации? задача: Функцию, которая возвращает среднее геометрическое элементов столбца и...

Почему не обнуляется указатель через функцию?
В функцию передаю указатель на целое число, хочу удалить память а сам указатель установить в NULL. Но он не устанавливается. Если все...

118
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
30.04.2019, 02:42
alexbmd,
C++
1
2
3
4
5
6
7
    char* p = (char*)malloc(strlen("Thunderbird") + 1);
    strcpy(p, "Thunderbird");
    for (char* pp(p); *pp; ++pp) if (*pp > 'Z') { continue; }
    else if (*pp < 'A') { continue; }
    else { *pp = *pp | 0x60; }
 
    printf("str3 = %s ", p);
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
30.04.2019, 03:44
alexbmd, ну ты же его в цикле стал увеличивать вместо того, чтобы воспользоваться для этой цели отдельным указателем-счётчиком, вот оригинала нигде и не сохранилось.
zayats80888, например, поступил умнее и написал цикл for (char* pp=p; *pp; ++pp)
в конце цикла pp будет указывать в конец выделенной памяти(да это собственно уже будет неважно), а p так и будет в начале, его никто не плюс-плюс-овал!
А вот если бы мы не оставили оригинальное значение p в покое, если бы плюс-плюсовали бы его, нам бы после цикла долго пришлось бы ломать голову "а как всё откатить как было"
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
30.04.2019, 08:08  [ТС]
https://stackoverflow.com/ques... 17#2661917

получается тут опечатка в этих двух вариантах ?

C++
1
for ( ; *p; ++p) *p = tolower(*p); -  J.F. Sebastian
C++
1
 for ( ; *p; ++p) if(*p > 'Z') {continue;} else if (*p < 'A') {continue;} else {*p = *p|0x60;} – Oleg Razgulyaev
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
30.04.2019, 10:45
Цитата Сообщение от alexbmd Посмотреть сообщение
почему for обнуляет вместо того чтобы присвоить ?
Что обнуляет? Где?
Цитата Сообщение от alexbmd Посмотреть сообщение
получается тут опечатка в этих двух вариантах ?
Нету здесь нигде опечатки, ваш p просто сместился в памяти с начала
строки в ее конец. Я же вам говорю скачайте книгу для новичков по С++ и отпадет
необходимость задавать вопросы здесь, еще никому с наскоку не удалось оседлать С++.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main() {
    char* p = (char*)std::malloc(std::strlen("Thunderbird") + 1);
    std::strcpy(p, "Thunderbird");
    for (; *p; ++p) {
        if (*p > 'Z' || *p < 'A') {
            continue;
        } else {
            *p = *p | 0x60;
        }
    }
    std::printf("%s\n", p - std::strlen("Thunderbird"));
}
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
30.04.2019, 12:22  [ТС]
Azazel так откуда вы думаете эти вопросы беру ? с книжек для начинающих. потому и вопросы задаю в разделе для начинающих.

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

господа а такой вопрос, обезательно делать malloc или достаточно strcpy, strdup для помещения стринга в область памяти для записи ?
C++
1
2
3
char * str1 = "very long string"; //string placed in read only memory
char * str2;
str2 = strdup (str1); //is it available for writing str2?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
30.04.2019, 12:24
https://ru.wikipedia.org/wiki/Strdup
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
08.05.2019, 15:55  [ТС]
Kuzia domovenok,
правильно я понимаю
strdup - по умолчанию копирует в heap
strcpy (и все другие) - по умолчанию копируют в stack
?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
08.05.2019, 16:02
alexbmd, нет, конечно, что за ерунда. strcpy и другие копируют всё что им скажут везде где им скажут. Забудьте уже про свои heaps и stackи! Я сколько вас ни читаю - всё время ощущение, что ты сам себе неприятности придумываешь!
Словно пишешь в школе диктант по русскому, на котором обычные двоечники пропускают все запятые. А ты вроде не двоечник, но при этом наоборот, ставишь море лишних запятых в тексте.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
08.05.2019, 16:32  [ТС]
Kuzia domovenok,
char *a="abc"; //"константная" память

char b[]; //стэк

strcpy // в стэк

если мы задекларируем как *b то strcpy туда ничего не запишет. получается по умолчанию в стэк
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
08.05.2019, 16:35
alexbmd, наркоман штоле? Полностью программу покажи! Я не понимаю, что ты сказать пытаешься?
strcpy(a, b), strcpy (b, a) или что?
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
08.05.2019, 17:27  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
наркоман штоле?
по себе судим

C++
1
2
3
char *a="abc"; //"константная" память
char b[4]; //стэк
strcpy(b,a); // в стэк
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
08.05.2019, 17:45
то что ты написал работает. В чём тогда проблема?
Цитата Сообщение от alexbmd Посмотреть сообщение
если мы задекларируем как *b то strcpy туда ничего не запишет. получается по умолчанию в стэк
это проблема вообще не стека и не кучи. Более того - это проблема не строк. Напишешь ты int* b; - ты всё равно не сможешь ничего записать! У тебя же не инициализирован указатель!
если он был бы инициализирован - пиши в эту память сколько угодно! При чём не важно как. Если платформа позволяет, например, бери инициализируй себе указатель нужным тебе адресом и пиши на здоровье!
C++
1
2
int* b=0xB8000; 
b[0]=0; b[1]=1;
(но такое только на специальных платформах, типа микроконтроллеров или доса бывает)
стек... не стек... откуда у тебя вообще такие заботы?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
08.05.2019, 18:06
Цитата Сообщение от alexbmd Посмотреть сообщение
почему for обнуляет вместо того чтобы присвоить ?
О чем речь вообще? Где вы тут увидели "обнуляющийся" указатель???

Добавлено через 18 минут
Цитата Сообщение от alexbmd Посмотреть сообщение
strdup - по умолчанию копирует в heap
strcpy (и все другие) - по умолчанию копируют в stack
strdup создает копию строки в динамической памяти. Никакого "по умолчанию" или "не по умолчанию" у нее нет.
strcpy копирует строку туда, куда вы укажете первым параметром. Никакого "по умолчанию" или "не по умолчанию" у нее нет.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
09.05.2019, 02:00
alexbmd, strdup содержит внутри себя malloc, об этом же написано.

Если тебе хочется создать велосипед, то из malloc и strcpy получится твоя собственная реализация strdup.

Добавлено через 2 минуты
(ну там ещё strlen понадобится, для автоматизации определения длины )
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
09.05.2019, 14:44  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
об этом же написано.
ну а я разве говорю обратное ?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Где вы тут увидели "обнуляющийся" указатель?
уже нигде. этот вопрос решён выше.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
копирует строку туда, куда вы укажете первым параметром.
ну так пример выше. по умолчанию в стэк. втом смысле чтоб это было не в стэк нам надо в куче выделять память. без этих дополнительных действий будет только стэк. или кроме стэка и кучи можно другую память выделить/назначиь ?

Цитата Сообщение от zayats80888 Посмотреть сообщение
char* pp(p);
я понимаю *pp=p. но что это за запись такая ? ни в одной книжке не попадалась такая конструкции инициализации . где можно прочитать про такие и другие не стандартные инициализации?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.05.2019, 14:47
Цитата Сообщение от alexbmd Посмотреть сообщение
я понимаю *pp=p
не понимаете, char* pp = p;
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
09.05.2019, 14:50
Цитата Сообщение от alexbmd Посмотреть сообщение
где можно прочитать про такие и другие не стандартные инициализации?
Эта инициализация стандартная.

Можно почитать здесь: "С. Липпман, - Язык программирования C++. Базовый курс", страница 76 и далее (можно воспользоваться предметным указателем и найти все темы по слову "инициализация").
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
09.05.2019, 14:53  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Напишешь ты int* b; - ты всё равно не сможешь ничего записать!
кстати
C++
1
2
3
int arr2[][3] = {{1,5,9},{9,5,1}}; //надо указывать длину
//как закастить 2D array to array of pointers?
int *ptr[] = {arr2[0],arr2[1]}; //как без индексациии строк присвоить/закастить массив?????
Добавлено через 52 секунды
zayats80888, если я не написал и так само собой понятное это не значит что я не понимаю

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно почитать здесь: "С. Липпман, - Язык программирования C++
а онлайн есть ? линк?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.05.2019, 14:58
Цитата Сообщение от alexbmd Посмотреть сообщение
как без индексациии строк присвоить/закастить массив?????
никак, нет никакого массива указателей, arr2 это один константный указатель на массив int
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.05.2019, 14:58
Помогаю со студенческими работами здесь

В определенный момент массив почему-то обнуляется
Вот листинг: #include &lt;fstream&gt; #include &lt;iostream&gt; using namespace std; double _AverageGain; void main() { int Digit; ...

Почему во время чтения из файла переменная row_i в цикле постоянно обнуляется?
Имеется следующий код: #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main () { char row;

Переполнение знаковых целых чисел: почему значение переменной обнуляется, а не записывается младшее значение?
что то не пойму, как происходит переполнение знаковых целых чисел вот #include &lt;iostream&gt; int main(int argc, char* argv) ...

Почему массив не обнуляется
Не знаю почему массив не обнуляется. #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;clocale&gt; ...

Не обнуляется таймер почему-то
procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled:=True; Form1.Button1.Enabled:=False; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru