Присвоение указателя r-значению в c - PullRequest
0 голосов
/ 13 марта 2019

Может ли кто-нибудь помочь объяснить, почему запуск исполняемого файла (созданного из следующей программы на C с использованием Dev-C ++ 5.6.3) вызывает сбой?В Pradip Dey и Ghosh Manas 2013 есть некоторые объяснения по основам работы с компьютером и программированию на C, в которых говорится, что «Местоположение 1000 может содержать программу. Так как это только для чтения, операционная система вызовет ошибку сегментации. Что насчет * pi = 5«Опять же, это, скорее всего, вызовет ошибку сегментации, поскольку для программного кода обычно используются меньшие адреса памяти. Эта область только для чтения. Необходимо заранее знать, где находится эта константа в памяти». *

Однако мне эти объяснения трудно понять

int main()
{
    int *ip;

    ip = (int*)1000;
    *ip = 5;
}

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

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

вы объявили указатель int *ip; Затем вы присвоили ему значение 1000.Последний должен быть адресом некоторых данных в памяти.Почему 1000?это может быть адрес памяти, который недоступен, или адрес памяти некоторых других данных или адрес памяти кода вашей программы.В общем, если вы не пишете программное обеспечение системного уровня, вы не можете делать какие-либо предположения о жестко закодированных адресах в памяти.Вы можете полагаться только на адреса, предоставленные вашей программой.Таким образом, ваша попытка присвоить значение памяти с адресом 1000 закончилась ошибкой сегментации, что означает, что этот адрес вам недоступен.

Существует несколько способов правильно использовать указатели.

1) использовать адрес существующей переменной:

 int var;
 int *ip = &var;
 *ip = 5;

2) использовать адрес динамически распределенной памяти, возвращенный вам, скажем, malloc

 int *ip = malloc(sizeof(int));
 *ip = 5;
 ...
 free(ip);
0 голосов
/ 14 марта 2019

Но следующее назначение выглядит нормально:

char *ptr;

ptr = "Input a string: ";
printf("%s", ptr);

Есть некоторые различия между значением r числового типа и значением строки?

На самом деле я нашел это полезным: Почему в С нельзя целочисленное значение присваивать int * так же, как строковое значение можно назначать для символа *?

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