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

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

30.04.2019, 02:01. Показов 9076. Ответов 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
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
17.07.2019, 16:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alexbmd Посмотреть сообщение
я это понимаю как удалить значение у перменной по адресу 2000. т.е. наш указатель больше не ссылается на 1000 но по адрессу 1000 все еще есть переменная со значением 10
Немного не так. Имеем:
1) в функции getRandom() выделяется локальная переменная r, в которую записывается адрес в куче. По этому адресу пишем 10.
2) при выходе из функции возвращаем адрес в куче (там по прежнему 10). Сама переменная r теряется.
3) этот адрес записывается в локальную переменную ptr в main(). По этому адресу по прежнему находится 10.
4) последующая delete() освобождает память в куче, полученную после getRandom(). Теперь переменная ptr ссылается в никуда.
5) сама локальная переменная ptr теряется после завершения main()
Что находится по старому адрес в куче, уже не важно. В debug-версии, содержимое вытирается. В release даже и не скажу. Главное то, что память возвращается в кучу.
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
17.07.2019, 17:32  [ТС]
точно, упустил второй шаг из виду. спасибо.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
26.07.2019, 14:48  [ТС]
друзья почему так работает
C++
1
2
char *p; 
p = "hello";
вернее мы спокойно во второй строчки и определяем память и присваем указатель на неё

а вот так не хочет
C++
1
2
3
    char * test;
    //test = (char*)malloc (40);
    memcpy(test, "hello", 6);
мы же указываем размер , указатель откуда. ну так пусть компилчятор выделит необходимую область . зачем прибегать к malloc? а то потом следи за ним /удаляй
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
27.07.2019, 00:29
Цитата Сообщение от alexbmd Посмотреть сообщение
вернее мы спокойно во второй строчки и определяем память и присваем указатель на неё
Ну так место для литерала выделяется в статической памяти. Указателю все равно откуда вы память взяли. Главное, чтобы она была и была валидной.

Цитата Сообщение от alexbmd Посмотреть сообщение
ну так пусть компилчятор выделит необходимую область
Вы его это делать не просили, вот он и не выделил.

Цитата Сообщение от alexbmd Посмотреть сообщение
зачем прибегать к malloc?
Можно и не прибегать.
C++
1
2
3
4
5
    char * test;
    static char buf[6];
    test = buf;
 
    memcpy(test, "hello", 6);
Что вы сделать-то хотите?
0
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
27.07.2019, 13:43
alexbmd, хватит страдать фигнёй, по кусочкам спрашивая банальщину!
test = buf;
p = "hello";
a=b;
...=...
это не копирование, блин, строк в Си! Это, очень грубо выражаясь, создание ещё одного указателя на ту же самую строку!
0
698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255
27.07.2019, 14:38
Цитата Сообщение от alexbmd Посмотреть сообщение
мы же указываем размер , указатель откуда. ну так пусть компилчятор выделит необходимую область . зачем прибегать к malloc? а то потом следи за ним /удаляй
Когда-то давно, когда язык C только появился, организацией ANSI (Американский Национальный Институт по Стандартизации) был сформирован так называемый Комитет C89, т. е. группа человек, которая должна была создать первый стандарт языка C. Главную свою цель комитет обозначил следующей фразой: «сохранить дух языка C»:

1. Доверять программисту.
2. Не мешать программисту делать то, что ему нужно.
3. Сохранить язык маленьким и простым.
4. Предоставлять только один способ выполнить действие.
5. Сделать язык быстрым, даже в ущерб портабельности.

Обратите внимание на пункты №1 и №2. Язык вам доверяет. Если вы сказали, что память выделять не надо, значит язык ее не будет выделять.

P. S. Конечно, C и C++ это абсолютно разные языки, но касательно, по крайней мере, пункта 1 их дух схож.

P. P. S. Кстати, советую вам начать изучение с языка C, а не C++ (см. пункт №3).
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
29.07.2019, 14:55  [ТС]
DrOffset, ну можно еще проще
C++
1
char test[6];
это понятно да.
я просто надеялся , предоставив , размер , стартовый адрес компилятор додумается выделить в статической памяти место для данного литерала

Kuzia domovenok, почему не копирование ?
если я делаю так
C++
1
2
3
4
    const char *p = "hello";
char * test;
    test = (char*)malloc (40);
    memcpy(test, p, 6);
вроде это копирование

просто еще один указатель это
C++
1
2
3
    char * test;
    static char buf[6];
    test = buf;
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.07.2019, 15:59
Цитата Сообщение от alexbmd Посмотреть сообщение
вроде это копирование
Не путай копирование содержимого и копирование адреса, по которому содержится это содержимое.

Добавлено через 2 минуты
Примерно то же самое что записать на блокноте номер страницы в книге, или же переписать в блокнот из книги всю эту страницу текста.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
29.07.2019, 16:41  [ТС]
да я это понимаю
но разве malloc не выделяет память для всего содержимого а не только адресса ?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.07.2019, 17:08
Память для адреса выделена в строке
C++
1
char * test;
а malloc уже выделяет память и возвращает значение её адреса, которое и записывается в test.

Добавлено через 4 минуты
Но можно туда записать значение адреса первого элемента массива static char buf[6]. Можно ещё какой-нибудь адрес записать. Как и в твоём посте #103.

Но содержимое того, что находится по этому адресу, можно копировать с помощью memcpy/strcpy/поэлементного копирования, если память по этому адресу выделена приложению.

А в
C++
1
2
char * test;
    memcpy(test, "hello", 6);
под указатель память выделил, а адрес в него никакой не записал. Потому со 99.9999999% вероятностью значение адреса, которое там было, указывает вообще не на ту память, которая выделена твоей программе.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
29.07.2019, 19:46  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
можно копировать с помощью memcpy/strcpy/поэлементного копирования, если память по этому адресу выделена приложению.
что значит выделена приложению ?

сейчас попробовал
C++
1
2
3
char test[1];
memcpy(test, "hello", 6);
cout << test[2];
работает. получается memcpy просто копирует указатель ? да но я жидал compile error тк. декларировали test[1] а печатаем [2]
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.07.2019, 21:52
Цитата Сообщение от alexbmd Посмотреть сообщение
сейчас попробовал

работает
Этот код может вывалится в ошибку из-за обращения к не выделенной памяти.

Добавлено через 3 минуты
Чтобы он никогда не вываливался, можно вызывать только
C++
1
2
memcpy(test, "hello", 1);
cout << test[0];
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
30.07.2019, 10:24
Цитата Сообщение от alexbmd Посмотреть сообщение
да но я жидал compile error тк. декларировали test[1] а печатаем [2]
GCC c O2 скорее всего выдал бы как раз warning
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
31.07.2019, 15:48  [ТС]
еще раз поковырялся в массивах/ссылках, насчёт destination as pointer не уверен, но в destination as array точно копируется всё содержимое а не указатель. я про memcpy

вот как правмльно
C++
1
2
3
4
    char * test;
    test = (char*)malloc (1); // так?
    memcpy(test, "hello", 6);
    puts(test)
или
C++
1
2
3
4
    char * test;
    test = (char*)malloc (6); // или так?
    memcpy(test, "hello", 6);
    puts(test)
если с примером из 111 поста варнинг еще даёт то в этих двух случаях варнинга нет
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
31.07.2019, 16:02
alexbmd, второй вариант. В случае первого возможен вылет или порча данных в программе.

Добавлено через 1 минуту
И ещё. Не забудь после всех действий с test выполнить
C
1
free(test);
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
31.07.2019, 17:42  [ТС]
страно тогда почему нет даже варнинга для первого варианта ? :\
C++
1
2
3
4
5
6
7
    char * test;
    const char * hello = "hello";
    test = (char*)malloc (1);
    memcpy(test, hello, 6);
    const char * p = hello;
    printf("p - %p , t - %p , h - %p \n",p,test,hello );
    puts(test);
пример показывает что memcpy именно копирует все содержимое а не только указатель, несмотря на malloc(1)
warning pedantic не даёт ни каких варнингов

и последний вопрос:
правильно я понимаю что для test нет других вариантов , только malloc , если мы хотим копировать все содержимое. спрашиваю потому что не хочеться следить за malloc и делаь free
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
31.07.2019, 17:54
Цитата Сообщение от alexbmd Посмотреть сообщение
страно тогда почему нет даже варнинга для первого варианта ?
Потому что обращения к памяти компилятор не контролирует. Для этого есть специальные программы, называемые "отладчиками памяти" (memory debugger), которые позволяют обнаруживать обращения программы туда, куда это недопустимо.

Если пользуешься malloc и free, или там new и delete, то следить обязательно придётся. Не хочется - начинай разбираться с std::string и std::vector.
1
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
31.07.2019, 19:31
Цитата Сообщение от alexbmd Посмотреть сообщение
спрашиваю потому что не хочеться следить за malloc и делаь free
Вы не тот язык выбрали совершенно, если вам не хочется следить. Выбирайте C# или Java или что-то еще наподобие.
Сила C++ именно в том, что вы можете следить за такими вещами.
1
0 / 0 / 0
Регистрация: 02.08.2019
Сообщений: 2
02.08.2019, 17:26
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
 
double number();
double factor();
double expr();
double brackets(); 
double power();
 
int main()
{
    double n;
    setlocale (LC_ALL, "Rus");
 
    std::cout << "the result of calculatiob:" << std::setprecision(10) << n std::endl;
 
    std::cin.get();
    return 0;
}
 
double number()
{
    double result = 10.0;
    double k = 0.0;
    int sign = 1; 
    char c;
}
 
c = std::cin.get();
 
while (c == '')
    c = std::cin.get();
    if (c == '')
        sing = -1;
 
else {
 
if (c != '+')
    std::cin.putback(c);
    while (true)
    {
        c = std::cin.get();
        if (c >= '0' && c <= '9')
            result = result * 10.0 + (c - '0'); 
else 
{
    std::cin.putback(c);
    breack;
}   
c = std::cin.get
 
if (c >= '0' && c <= '9')
{
    result += (c - '0') / k;
    k *= 10.0
 
}
else std::cin.putback(c);
breack;
    }
 
 
 
else 
{
    std::cin.putback(c);
    brack;
}
 
 
}
 
else 
{
    std::cin.putback (c);
 
brack
}
 
esle {
    std::cin.putback(c);
    return sing * return;
}
 
double result;
double temp;
char op;
 
result = power ();
 
whiel (true)
{
op = std::cin.get();
 
    while (op ==  '') 
        op = std::cin.get();
 
    switch (op)
    {
    case '*' :
        result = power();
        break;
    
    case '/':
    default: 
        if (temp == 0.0)
        {
            std::cout << "division" << std::endl;
        }   
        result /= temp;
        break;
        default:
            std::cin.putback(op);
            return result;
    }
 
double expr()
{
    double result;
    char op;
    result = factor();
 
    while (true)
    {
        op = std::cin.get();
 
        while (op == '')
            op = std::cin.get();
 
    switch (op)
    {
    case '+':
         reslt +=factor();
        break;
    case '-':
    result -= factor ();
    default:
        break;
    default:
        std::cin.putback(op);
        return result;
 
    }
double brackerts()
{
    double result;
    int sign = 1;
    char op;
    op = std::cin.get();
 
 
if (op == '-')
{
    sign = -1;
    op = std::cin.get();
 
 
 
}
esle 
{   
    if (op == '+')
        op = std::cin.get();
}
 
while (op == '')
    op = std::cin.get(); 
 
    if (op == '(')
{
resilt = sign * expr();    
 
if (op != ')')
{
    std::cout << "jertexf" << std::endl;
 
 
}
retun result;
}
else 
{
 
    std::cin.putback(op);
    return sign * number();
}
 
 
double power()
{
    double result;
char op;    
std::vector < double > args;
 
args.push_back (brackets());
}
 
 
while (true)
{
op std::cin.get();
while (op == ' ')
    op = std::cin.get();
    while (op == '')
    {
        op = std::cin.get();
 
 
 
        if (op == 'v')
            args.push_back(brackets());
        else
        {
            std::cin.putback(op);
            break;
        }
    }
    for (int i = args.size() - 1; i >  0 ; i --)
        args[ i - 1] = pow(args[i - 1]) , args[i];
        return args[0];
 
 
}
}
 
 
 
    }
}
 
 
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2019, 17:26

В определенный момент массив почему-то обнуляется
Вот листинг: #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; ...


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

Или воспользуйтесь поиском по форуму:
119
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru