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

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

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

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, если использование неинициализированных указателей в С++ сопряжено с рисками неопределённого поведения и случайного доступа к памяти, то для каких целей в языке оставлена возможность объявления неинициализированных указателей?
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"...

130
-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
 Аватар для Наталья8
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,265
15.04.2026, 00:58

Ну такое можно и самому догадаться. Долго учиться не надо.
0
 Аватар для Наталья8
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,265
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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
15.04.2026, 01:24
Цитата Сообщение от Also what Посмотреть сообщение
Выдаёт:
p0= 0x7194e84818
*p0= -7.72784e-33
Как-то так.
И что из этого? Вы нам экспериментами с программками что-то хотите продемонстрировать про неопределенное поведение?
0
 Аватар для Наталья8
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,265
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
 Аватар для Наталья8
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,265
15.04.2026, 01:34
0
 Аватар для Наталья8
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,265
15.04.2026, 01:38
C++
1
2
unsigned char _alr[64]{};
*(double*)_alr = 12.345;
Так прокатит?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
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
 Аватар для Наталья8
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,265
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,132
Записей в блоге: 2
15.04.2026, 02:20
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если тип поддерживает trap representations
Спасибо за экскурс в историю. Всегда убеждаюсь что все хорошо в меру (включая стандарт), и здравый смысл никто не отменял. Если память (корректно) выделена, то читать я ее могу. Понятно что если чтение какое-то "хитрое" и предполагает активные но скрытые действия - проблемы возможны. Но я не видел таковых на процессорах что я работал. И тут неизменно приводятся всякие итаники/титаники, фантастические армы и.т.п. Мол, а вот есть такие машины что... Думаю что пока такая машина не стоит на моем рабочем столе - нет никакого смысла увлекаться тем что "гипотетически возможно", это напрасная трата времени
0
 Аватар для Наталья8
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,265
15.04.2026, 02:32
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
int main()
{
  unsigned a;
std::cout << a << std::endl;

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

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

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

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

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

Или вы это и имели в виду: мол, проблем не будет, ибо компилятор все равно выкинет такой код?
1
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,132
Записей в блоге: 2
15.04.2026, 03:26
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Или вы это и имели в виду: мол, проблем не будет, ибо компилятор все равно выкинет такой код?
Я имел ввиду простой вещь: за то что я прочитал неинициализированное - мне ничего не будет Конечно если я начну с ним что-то делать - может быть все что угодно. Думаю это всем понятно и обсуждения не заслуживает
0
 Аватар для Наталья8
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,265
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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
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,132
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru