@wqrfgdgtttte

Как вывести значение указателя без иннициализации?

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

#include <stdio.h>

int main(){
    int *ptr0, *ptr1;
    printf("%d %d\n",ptr0,ptr1);
    *ptr0= 21;
    printf("%d %d ",ptr0,ptr1);
    return 0;
}
  • Вопрос задан
  • 115 просмотров
Пригласить эксперта
Ответы на вопрос 4
AshBlade
@AshBlade
Просто хочу быть счастливым
В настройках проекта отключи проверку SDL - https://stackoverflow.com/a/38445156/14109140
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Первый printf должен выдать адреса, которые находятся в ptr1 и ptr2.
До второго printf скорее всего дело не дойдёт, будет выдана ошибка доступа к чужой памяти.
Но, в системах, где нет контроля доступа, например в DOS, значение 21 будет записано по случайному адресу и дальнейшее поведение как программы, так и системы непредсказуемо.
Ответ написан
Комментировать
maaGames
@maaGames
Погроммирую программы
Если запускаешь в дебаге, то указатели инициализированы нулями, то есть и в консоль будут выведены нули и при попытке туда записать значение будет падение программы - запрещено записывать в адреса от 0 до какого-то там значения зарезервированного. Возможно, преподователь хочет услышать именно то, что программа падает.
В релизе в указателе может быть любой набор битов и там уже можно считать везением, если программа сразу упадёт из-за ошибки доступа к памяти.
В целом, это UB и так делать не надо.
Ответ написан
Комментировать
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Ну, поехали.
int *ptr0, *ptr1;
Обьявили два указателя на int. Поскольку переменные на куче, там может быть все, что угодно.
printf("%d %d\n",ptr0,ptr1);
Указатели так не печатают. Ты получишь бессмысленное число, которое не использовать нигде. Обычно указатели печатают так:
printf("%0X %0X\n", ptr0, ptr1);
*ptr0= 21;
Дальше этого оператора программа работать не будет - в этом месте в 99% возникнет прерывание защиты памяти - то есть попытка обращения к области памяти, которая не принадлежит программе. При этом как правило возникает SIGSEGV и все. Если программа выполняется в однозадачной среде, где нет защиты памяти - такой оператор приведет к зависанию, поскольку в нижних адресах обычно расположены системные таблицы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы