Ошибка GCC, плохой код или gcc - хороший компилятор - PullRequest
0 голосов
/ 27 марта 2019

У меня есть этот код:

int *b;
b = 50;
printf("Pointer point to address: %p and also point to this value: %d", b, *b);
return 0

Я получил эту ошибку: main.c: 6: 7: предупреждение: назначение делает указатель из целого числа без приведения [-Wint-преобразование]
тайм-аут: контролируемая команда сбросила ядро ​​
sh: строка 1: 47524 Тайм-аут ошибки сегментации 10 с основной

Я хочу напечатать значение из пятидесяти байт памяти.

Правильно ли мой код илибудет ли компилятор работать?

1 Ответ

1 голос
/ 27 марта 2019

Если вы запускаете программу на последних ОС, таких как Linux, Mac или Windows, 50 не будут байтами, расположенными по адресу 50 в вашей физической памяти; это адрес в виртуальном пространстве.

Тогда ваш процесс (программа) имеет доступ только к очень ограниченному диапазону в этом виртуальном пространстве, который вряд ли будет 50; в этом случае ОС защищает от несанкционированного доступа и останавливает ваш процесс (segfault); в любом случае вы могли бы даже получить результат, который может быть или не быть правильным, это называется неопределенное поведение , и в этом случае лучше не полагаться на явно работающий исполняемый файл.

Чтобы получить прямой доступ к физической памяти, вам необходимо либо скомпилировать модуль ядра, либо загрузиться, например, с DOS-подобной ОС.

main.c: 6: 7: предупреждение: присваивание делает указатель из целого числа без приведения [-Wint-преобразование]

При этом вам нужно разыграть 50 как int *, чтобы снять предупреждение.

b = (int *)50;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...