Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
-342 / 1 / 0
Регистрация: 27.12.2025
Сообщений: 29

Неинициализированные указатели

14.04.2026, 17:27. Показов 8051. Ответов 127
Метки нет (Все метки)

Подскажите пожалуйста, если использование неинициализированных указателей в С++ сопряжено с рисками неопределённого поведения и случайного доступа к памяти, то для каких целей в языке оставлена возможность объявления неинициализированных указателей?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.04.2026, 17:27
Ответы с готовыми решениями:

Неинициализированные локальные переменные
Меня интересует как обходить данные ошибки. В чем соль ошибок? Проблема даже не в том что они...

Неинициализированные переменные
пишет типа не инициализированы d1 и d2,хотя они объявлены#include "iostream" using namespace std;...

Неинициализированные локальные переменные warning C4700
// Laboratornaa.cpp: определяет точку входа для консольного приложения. // #include"stdafx.h"...

127
-342 / 1 / 0
Регистрация: 27.12.2025
Сообщений: 29
15.04.2026, 00:55  [ТС]
C++
1
2
3
4
5
6
#include <iostream>
int main ( ) { 
double * p0 ;
std::cout << "p0=  " << p0 << "\n" 
<< "*p0= " << *p0 << std :: endl;
 }
Выдаёт:
p0= 0x7194e84818
*p0= -7.72784e-33
Как-то так.
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,193
15.04.2026, 00:58

Ну такое можно и самому догадаться. Долго учиться не надо.
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,193
15.04.2026, 01:03
Цитата Сообщение от Also what Посмотреть сообщение
Выдаёт:
p0= 0x7194e84818
*p0= -7.72784e-33
Как-то так.
А зачем?
Надо что бы какой то смысл был...

Добавлено через 2 минуты
Цитата Сообщение от Also what Посмотреть сообщение
std::cout
Не доверять... Писать форматированный вывод.
0
-342 / 1 / 0
Регистрация: 27.12.2025
Сообщений: 29
15.04.2026, 01:04  [ТС]
Наталья8, Догадайся.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
15.04.2026, 01:24
Цитата Сообщение от Also what Посмотреть сообщение
Выдаёт:
p0= 0x7194e84818
*p0= -7.72784e-33
Как-то так.
И что из этого? Вы нам экспериментами с программками что-то хотите продемонстрировать про неопределенное поведение?
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,193
15.04.2026, 01:32
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void pri_nt(unsigned adr) {
    printf(" adr = %u   mean = %f",adr, *(double*)adr);// %p
}
 
 
int main()
{
    unsigned *add = (unsigned*)calloc(2, sizeof(int));
*(double*)add = 12.345;
    unsigned adr = (unsigned)add;
pri_nt(adr);
             free(add);
    getchar();
}
Определённое или нет?
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,193
15.04.2026, 01:34
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,193
15.04.2026, 01:38
C++
1
2
unsigned char _alr[64]{};
*(double*)_alr = 12.345;
Так прокатит?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
15.04.2026, 01:40
Цитата Сообщение от Also what Посмотреть сообщение
Выдаёт:
p0= 0x7194e84818
*p0= -7.72784e-33
Как-то так.
И что из этого? Вы нам экспериментами с программками что-то хотите продемонстрировать про неопределенное поведение? Здесь, конечно, форум для начинающих и нет ничего удивительного в такой наивности начинающего. Но если у начинающего и после трех страниц объяснений просветления не наблюдается - то тут уже надежда на светлое будущее этого начинающего начинает угасать.

А ну-ка попробуем поинтереснее

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
int main()
{
  unsigned a;
 
  std::cout << a << std::endl;
 
  unsigned i;
  for (i = 0; i < 100; ++i)
    if (i == a)
      break;
 
  std::cout << i << std::endl;
}
GCC

Code
1
2
0
100
Clang

Code
1
2
0
100
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,193
15.04.2026, 02:01
Работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void pri_nt(unsigned adr) {
    printf(" adr = %u   mean = %f",adr, *(double*)adr);// %p
}
 
 
int main()
{
    unsigned char _alr[64]{};// Хватило бы и четырёх байт.. Это я конечно перебор.
*(double*)_alr = 12.345;
    unsigned adr = (unsigned)_alr;
pri_nt(adr);
         
    getchar();
}
Это я послал в функцию unsigned int, в нём адрес массива unsigned char.
в массив вставил double...

Добавлено через 7 минут
Цитата Сообщение от Also what Посмотреть сообщение
Наталья8, Догадайся.
Были бы мозги... Я же деревянный.

Добавлено через 11 минут
Цитата Сообщение от Also what Посмотреть сообщение
Неинициализированне указатели
-----------------
Секрет открою... Неинициализированных указателей не должно быть...
Они должны быть инициализированные.
-----------------
Я недавно шифровал...
Без разницы массив какого типа ты используешь. Лишь бы места хватило.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,071
Записей в блоге: 2
15.04.2026, 02:20
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если тип поддерживает trap representations
Спасибо за экскурс в историю. Всегда убеждаюсь что все хорошо в меру (включая стандарт), и здравый смысл никто не отменял. Если память (корректно) выделена, то читать я ее могу. Понятно что если чтение какое-то "хитрое" и предполагает активные но скрытые действия - проблемы возможны. Но я не видел таковых на процессорах что я работал. И тут неизменно приводятся всякие итаники/титаники, фантастические армы и.т.п. Мол, а вот есть такие машины что... Думаю что пока такая машина не стоит на моем рабочем столе - нет никакого смысла увлекаться тем что "гипотетически возможно", это напрасная трата времени
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,193
15.04.2026, 02:32
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
int main()
{
  unsigned a;
std::cout << a << std::endl;

Пардон... Такая же херня.
Ерунда конечно, на одном компиляторе ошибка, на другом сама инициализируеться.
Я всё инициализирую сразу. Иначе не работает. И вам советую.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
15.04.2026, 02:51
Цитата Сообщение от Igor3D Посмотреть сообщение
Думаю что пока такая машина не стоит на моем рабочем столе - нет никакого смысла увлекаться тем что "гипотетически возможно", это напрасная трата времени
???

Не понимаю, почему такие вещи с таким трудом усваиваются, но еще раз:

Оптимизации и трансформации кода, основанные на UB, выполняются компилятором на стадии компиляции, на основе правил, описанных в стандарте языка. И эти правила - одинаковые для всех без исключения. Не важно, выросли ли какие-то нюансы этих правил из какой-то "экзотической" машины или нет, но применять эти правила компиляторы С будут везде - на всех машинах.

Так что то, что стоит у вас на столе, не имеет никакого значения. Компилятор С все равно будет видеть UB в доступе к неинициализированной переменной по тем правилам, которые я привел.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,071
Записей в блоге: 2
15.04.2026, 03:01
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так что то, что стоит у вас на столе, не имеет никакого значения. Компилятор С все равно будет видеть UB в доступе к неинициализированной переменной по тем правилам, которые я привел.
Имеет. Компилятор выдаст варнинг, это хорошо и правильно, вероятность ошибки здесь велика. Но никакого "UB" я в рантайме не получу за то что всего лишь прочитал что-то неинициализированное. Ничего не рухнет. Никогда. Все это "буря в стакане воды", не более того
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
15.04.2026, 03:09
Цитата Сообщение от Igor3D Посмотреть сообщение
Но никакого "UB" я в рантайме не получу за то что всего лишь прочитал что-то неинициализированное. Ничего не рухнет. Никогда. Все это "буря в стакане воды", не более того
В сообщении #49 я привел пример ясно видного UB "от того, что я прочитал что-то неинициализированное".

И дело там не в рантайме, а в том, что в компайлтайме компилятор принял меры для того, чтобы код с UB был удален из программы.

Или вы это и имели в виду: мол, проблем не будет, ибо компилятор все равно выкинет такой код?
1
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,071
Записей в блоге: 2
15.04.2026, 03:26
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Или вы это и имели в виду: мол, проблем не будет, ибо компилятор все равно выкинет такой код?
Я имел ввиду простой вещь: за то что я прочитал неинициализированное - мне ничего не будет Конечно если я начну с ним что-то делать - может быть все что угодно. Думаю это всем понятно и обсуждения не заслуживает
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,193
15.04.2026, 03:30
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
 
//====================
void step_n(unsigned int &n) {
    try {
        float *s = new float(0);
        n++;
    }
    catch (std::exception &exception) {
        std::cout << exception.what();
    printf(" -- %d\n", n);
    }
 }
//====================
int main()
{
    unsigned int gn = 0;
for (;;) {
        step_n(gn);
         }
    return 0;
}
Два гига заполняет...
0
Заблокирован
15.04.2026, 03:32
Цитата Сообщение от Igor3D Посмотреть сообщение
Конечно если я начну с ним что-то делат
Так а где с переменной a поста #49 что то делается?
Просто прочитали.

И вполне себе так программа рухнула : https://godbolt.org/z/b4GbvT7EP
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
15.04.2026, 03:56
Цитата Сообщение от 000d60 Посмотреть сообщение
И вполне себе так программа рухнула : https://godbolt.org/z/b4GbvT7EP
Я, кстати, сходу не понял, что там происходит с Clang. Похоже он просто недогенерирует код, в результате чего код main обрывается на полуслове (нигде нет ret). Выполнение просто напарывается на мусор в последовательности машинных команд и все падает.

Причем в сгенерированном коде виден только один вывод числа. Откуда в выводе на Godbolt берется второе - не ясно. На coliru выводится только одно число, а затем все падает:

https://coliru.stacked-crooked... efb45796fb

Очевидно Clang буквально применил оптимизацию по UB: код с UB генерировать не нужно, в результате он просто оборвал код посередине.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,071
Записей в блоге: 2
15.04.2026, 04:26
У меня никаких чудес нету, "а" заполнено мусором (большое число). Apple clang 14.0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.04.2026, 04:26

Ошибка, указывающая на неинициализированные переменные
#include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; int main() { setlocale(0, &quot;&quot;);...

Ошибка: неинициализированные переменные
Требовалось оформить класс ORDER, ошибка на 103-ей строке про неинициализированные переменные,...

Неинициализированные переменные
Здравствуйте. Возникла проблема с инициализацией переменных и конструкторов производного класса,...

Где и как могут применяться неинициализированные массивы?
Хотелось бы узнать где и как могут применяться неинициализированные массивы.

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно....


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru