Почему разыменование указателя и печать значения приводит к сбою программы - PullRequest
0 голосов
/ 06 июня 2018

Следующая программа дает результат правильно

#include <stdio.h>

int main()
{
    int address = 0x00018EA0;
    int *flashLocat = (int*)address;
    printf("%x\n%x\n%x\n",address,flashLocat,&flashLocat);

    return 0;
}

output

    18ea0
    18ea0
    180209e0

В то время как вышеуказанная программа следующим образом

#include <stdio.h>

int main()
{
    int address = 0x00018EA0;
    int *flashLocat = (int*)address;
    printf("%x\n%x\n%x\n%x\n",address,*flashLocat,flashLocat,&flashLocat);

    return 0;
}

падает, почемуэто сбой?Было бы здорово, если кто-нибудь ответит.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Прежде всего, вы не знаете, действителен ли адрес 0x00018EA0 или нет.

В первой программе вы не обращаетесь к ячейке памяти 0x00018EA0, вы просто обращаетесь кадрес и адрес указателя.

printf("%x\n%x\n%x\n",address,flashLocat,&flashLocat);

// address  --> is value of pointer, so it is valid
// flashLocat --> is value of pointer, so it is valid
// &flashLocat--> is the address of flashLocat, so it is valid

Но во второй программе вы фактически получаете доступ к ячейке памяти, которая выдает ошибку, если адрес неверен.

printf("%x\n%x\n%x\n%x\n",address,*flashLocat,flashLocat,&flashLocat);

// *flashLocat --> trying to access the location, can be INVALID
0 голосов
/ 06 июня 2018

0x00018EA0 - это случайный адрес, который (насколько можно судить) не имеет значения.Вероятность того, что он сопоставлен со страницей, очень мала;вероятность того, что он сопоставлен со страницей, которую ваш пользовательский процесс имеет разрешения для еще большего.

В результате, когда вы разыменовываете указатель, вы получаете доступ к той памяти, которая может не существоватьи что у вас, скорее всего, нет разрешения на доступ - вы получаете ошибку, в частности ошибку сегментации.

Первая программа не падает, потому что она никогда не обращается к памяти - она ​​только смотрит на значениеуказателя, который никогда не доступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...