Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 06.05.2021
Сообщений: 34
1

Почему в одном случае мусор выводится а в другом нет

17.09.2021, 05:00. Показов 1438. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#define _CRT_NO_SECURE_WARNINGS
#include <stdio.h>
int A[5][5];  //глобальная матрица
int a;        //Глобальная переменная   
int main()
{
    int b;           //Локальная переменная
    int B[5][5];  //Локальная матрица
    printf("A[0][0]=%d\n", A[0][0]);
    printf("B[0][0]=%d\n", B[0][0]);
    printf("a=%d\n", a);
    //printf("b = %d", b); // Работать не будет uninitialized variables
}
Результат работы программы:
A[0][0]=0
B[0][0]=-858993460
a=0

Я понял что в случае с глобальной переменной и матрицей они по умолчанию инициализированы нулями поэтому можно выводить их значения, которые храняться в участке их памяти. Мне понятно почему мы не можем вывести значение из локальной переменной, которая не была иницилизирована и в её участке памяти хранится мусор и это практически тоже самое что обратится к не инициализированному участку памяти. Но почему при этом без вопросов компиялтор выводит значение мусора из не инициализированной локальной матрицы? Мне не понятно.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.09.2021, 05:00
Ответы с готовыми решениями:

Delphi 7. Почему на одном компе содержимое Image1.Canvas выводится на принтер, а на другом нет?
То есть, код на компе с Windows 7 (разрешение экрана 1366*768) выполняется как надо, а на компе с Windows XP (разрешение экрана 1024*768)...

Почему в одном случае y=0, в другом - y=1 ?
#include &lt;iostream&gt; using namespace std; int main(int argc, char** argv) { int y; cout &lt;&lt; y; return 0; } Я так понимаю,...

Toast в одном случае работает в другом нет
Приветствую, в данном фрагменте кода если isOnline() возвращает true, то Toast выдает сообщение если isOnline() возвращает false,...

10
Злостный нарушитель
 Аватар для Verevkin
9771 / 5316 / 1210
Регистрация: 12.03.2015
Сообщений: 24,985
17.09.2021, 08:32 2
Цитата Сообщение от Constantin777 Посмотреть сообщение
Но почему при этом без вопросов компиялтор выводит значение мусора из не инициализированной локальной матрицы?
Компилятор ничо не выводит. Выводом занимается функция форматированного вывода printf(), которая тупо берёт значение по заданному ТОБОЙ адресу и тупо выводит его на консоль. Чо не так-то?
Цитата Сообщение от Constantin777 Посмотреть сообщение
Мне понятно почему мы не можем вывести значение из локальной переменной, которая не была иницилизирована и в её участке памяти хранится мусор...
Как это не можем? Могём! Именно это у тебя и происходит.

Добавлено через 1 минуту
Цитата Сообщение от Constantin777 Посмотреть сообщение
...можно выводить их значения, которые храняться...
Скажи мне, зачем ты пишешь "...ться" там, где не надо? Ведь делать так можно только специально. Это такой новый вид олбанского диалекта?
0
0 / 0 / 0
Регистрация: 06.05.2021
Сообщений: 34
17.09.2021, 08:56  [ТС] 3
Почему в одном случае мусор выводится а в другом нет


Я снял комментарий с 12 строчки кода, где находится локальная переменная b, которая не была инициализирована. И компилятор выдаёт ошибку uninitialized local variable 'b' used

В первом примере у меня с переменной b ничего не происходит так как строчка закоментирована. Как я понимаю это защита от обращения в участок памяти, который не был инициализирован. Поэтому вывести мусор из не инициализированной переменной b не получилось. А вот вывести значение мусора что хранится не инициализированной лок матрице B получается, что видно в первом примере. В этом и состоял вопрос.
0
Злостный нарушитель
 Аватар для Verevkin
9771 / 5316 / 1210
Регистрация: 12.03.2015
Сообщений: 24,985
17.09.2021, 09:02 4
Цитата Сообщение от Constantin777 Посмотреть сообщение
Поэтому вывести мусор из не инициализированной переменной b не получилось.
Всё зависит от настроек конкретного компилятора. Вот пример для GCC:

Почему в одном случае мусор выводится а в другом нет


Цитата Сообщение от Constantin777 Посмотреть сообщение
...можно выводить их значения, которые храняться...
Скажи мне, зачем ты пишешь "...ться" там, где не надо? Ведь делать так можно только специально. Это такой новый вид олбанского диалекта?
1
0 / 0 / 0
Регистрация: 06.05.2021
Сообщений: 34
17.09.2021, 09:06  [ТС] 5
Теперь понятно видимо в настройках Virtual Studio есть защита от обращения к не инициализированным переменным. Чтобы потом не мучится и не искать ошибки в коде. Странно почему для лок матрицы, такую защиту пропустили.
0
фрилансер
 Аватар для Алексей1153
6326 / 5454 / 1108
Регистрация: 11.10.2019
Сообщений: 14,508
17.09.2021, 09:12 6
Constantin777, чтение из неинициализированной переменной - это неопределённое поведение. Нужно избегать этого всеми силами
0
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
17.09.2021, 09:17 7
а почему токмо маленькую b обижает, а большую B нет, сцыт чель?

Добавлено через 4 минуты
Цитата Сообщение от Verevkin Посмотреть сообщение
Скажи мне, зачем ты пишешь "...ться" там, где не надо? Ведь делать так можно только специально. Это такой новый вид олбанского диалекта?
проверочное слово что делают (нет "ь" на конце) значит "хранятся" , 3 класс , 2 этаж
0
0 / 0 / 0
Регистрация: 06.05.2021
Сообщений: 34
17.09.2021, 09:21  [ТС] 8
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Constantin777, чтение из неинициализированной переменной - это неопределённое поведение. Нужно избегать этого всеми силами
Я с вами согласен. Вопрос был про то ,почему нет такой же защиты для лок матрицы B. Но выше объяснили что в другом компиляторе вообще всё происходит без ошибок, даже для лок переменной b. Видимо всё зависит от настроек компилятора. А я думал что есть какой то скрытый смысл или это где то применяется =Р
0
фрилансер
 Аватар для Алексей1153
6326 / 5454 / 1108
Регистрация: 11.10.2019
Сообщений: 14,508
17.09.2021, 09:41 9
Constantin777, от отсутствия инициализации нет никакой защиты - программист должен сам за этим следить.

Однако об этом может предупредить компилятор или статический анализатор.

Цитата Сообщение от Constantin777 Посмотреть сообщение
int A[5][5];  //глобальная матрица
int a;        //Глобальная переменная
глобальные и статические переменные/поля инициализируются нулями принудительно, даже если этого не указать явно. Для локальных - нужно указывать инициализацию явно
1
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
17.09.2021, 10:00 10
Лучший ответ Сообщение было отмечено Constantin777 как решение

Решение

Цитата Сообщение от Constantin777 Посмотреть сообщение
Вопрос был про то ,почему нет такой же защиты для лок матрицы B.
1) Потому что спецификация языка не требует диагностики таких случаев. У вас срабатывает опциональная диагностика, она может быть, может не быть, может быть частично.

2) По историческим причинам массивы чаще используются в качестве хранилища неинициализированной памяти (например, предназначенной для отложенной инициализации), поэтому ваш компилятор не подход к этому настолько строго.
1
638 / 393 / 75
Регистрация: 21.09.2008
Сообщений: 1,355
18.09.2021, 19:56 11
Цитата Сообщение от Constantin777 Посмотреть сообщение
в случае с глобальной переменной и матрицей они по умолчанию инициализированы нулями
Это поведение определённого компилятора, но не поведение, определённое Стандартом языка Си.

Цитата Сообщение от Constantin777 Посмотреть сообщение
о почему при этом без вопросов компиялтор выводит значение мусора из не инициализированной локальной матрицы? Мне не понятно.
А Вы продизассемблируйте "выхлоп" компилятора Си и посмотрите, где и как он расположил локальные переменные в функции. Они располагаются на стеке, который очень активно используется и изменяется. Для углублённого изучения смотрите подраздел 2.6 здесь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.09.2021, 19:56
Помогаю со студенческими работами здесь

Почему в одном случае возвращается массив, в другом объект?
Добрый день! Пишу api выдачи данных для графиков в приложении... Должно выводить в json объект, с двумя массивами... В data -...

Почему на одном компьютере работает , а на другом - нет?
Почему одна и таже программа, написанная на C++ в CodeBloks на одном компьютере, не работает на другом компьютере. Я д/з по...

Почему в одном месте работает, а в другом нет?
Доброго времени суток. Почему один код работает, а в другом сыпятся ошибки? Как бы смысл кода по сути один и тот же, но что-то мешает...

Почему программа работает на одном компьютере и нет - на другом?
Поправил программу - пример чата Delphi для своей локальной сети. Но почему-то с одного компьютера она работает а с другого - нет. И...

Datagridview! Почему в одном варианте работает, а в другом нет?!
надо было считать массив из *.ТХТ в датагридвью. сначала сделал так заполнение: for (int i = 0; i &lt; SetAppHaracters.GetLength(0);...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Winforstrap или красявый дизайн своими руками на HTML+JS+Winform­s
anomal6 04.03.2025
Сидел тут вечером ковырял проект на MAUI, и как же глупо создаются пакеты MSIX и система обновлений пакета публикации, но не об этом. Бывает нужен современный дизайн программы а писать на MAUI,. . .
Формат данных для симуляции физики, посредством распространённы­­­­­­­х не обученных моделей.
Hrethgir 04.03.2025
Что-то как-то снова потерялось, зато катангенсы закатангесились в одном сообщении. На днях писал, что планирую для работы апгрейдить (на этот раз удачно) девайс для работы (конкретно - здоровья для,. . .
Концепция variadic
CoderHuligan 04.03.2025
Мне не очень нравится (а кому это нравится?) что у нас есть отдельно компилятор, отдельно линковщик, причем со своим собственным командным языком. При этом усложнении надо знать помимо языка. . .
Java Record или Kotlin Data Class: что лучше для неизменяемых данных
Wired 04.03.2025
Java Record и Kotlin Data Class — два мощных инструмента для обуздания неизменяемых структур данных, каждый со своим уникальным подходом к решению этой задачи. История их появления весьма. . .
Создание производительны­­­х API с Java и gRPC
Wired 04.03.2025
В мире микросервисной разработки вопрос производительности часто становится краеугольным камнем. И хотя REST API давно завоевал сердца разработчиков своей простотой и интуитивностью, при высоких. . .
Что нового в JDK 24
Wired 04.03.2025
JDK 24 — это настоящий прорыв в эволюции Java, который кардинально меняет правила игры. В этом релизе разработчики Oracle наконец-то довели до ума множество критически важных улучшений в. . .
Разработка блокчейн с использованием Java: смарт-контракты и dApp
Wired 04.03.2025
Погружаясь в мир блокчейн-разработки на Java, разработчик получает доступ к внушительному арсеналу инструментов. В отличие от Solidity, который "заперт" в экосистеме Ethereum, Java предоставляет. . .
WebAssembly в Kubernetes
stackOverflow 03.03.2025
В современной экосистеме облачных технологий WebAssembly (Wasm) становится все более значимым компонентом, предлагая уникальный подход к выполнению кода в распределенных системах. Эта технология. . .
GitHub Actions или Jenkins: Выбираем CI/CD платформу
stackOverflow 03.03.2025
Непрерывная интеграция и развертывание (CI/ CD) изменили подход к разработке программного обеспечения, превратив его в бесшовный процесс от написания кода до развертывания в продакшн. GitHub Actions и. . .
Автоматизация тестирования Pull Request в Kubernetes: Интеграция с GitHub Actions и GKE
stackOverflow 03.03.2025
Масштабные проекты с использованием Kubernetes требуют надежной системы тестирования изменений перед их внедрением в продакшн-среду. Традиционный подход с ручной проверкой Pull Request не справляется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru