Что такое "(void *) - 1" в контексте возвращаемого значения sbrk? - PullRequest
0 голосов
/ 08 марта 2020

Страница Linux Man для sbrk() указывает, что при сбое возвращается (void*) -1. Что такое (void*) -1 и имеет ли оно какое-либо значение или это просто число, которое на самом деле никогда не может быть void*, которое приведено к void* только для того, чтобы соответствовать сигнатуре функции возврата void*? Я спрашиваю об этом, потому что раньше никогда не видел указатель на отрицательный адрес. Я не знал, что это возможно для разыменования на любой платформе.

Ответы [ 2 ]

2 голосов
/ 08 марта 2020

Это, как вы уже догадались, способ вернуть магию c значение -1. Он приводится к указателю, чтобы соответствовать сигнатуре функции. Вызывающий будет знать, как интерпретировать это значение magi c, и не пытаться разыменовать его.

Внутренне это фактически станет просто 0xFFFFFFFFFFFFFFFF (или 0xFFFFFFFF для 32-битного). может быть платформой, к которой этот адрес действительно может быть получен, но здесь это не цель.

1 голос
/ 08 марта 2020

В большинстве операционных систем память выделяется в виде набора страниц (это могут быть физические ОЗУ или виртуальные страницы, которые хранятся на постоянном диске / устройстве хранения и обычно занимают по 4 КБ каждая). Поскольку -1 (без знака 0xFFFFFFFFFFFFFFFF или 0xFFFFFFFF для 32-разрядного) является наибольшим возможным значением для QWORD (или DWORD для 32-разрядного), страница обычно не может начинаться с этого адреса, поскольку это самый последний адрес в адресном пространстве. Следовательно, -1 - это хорошее значение для указания ошибки в распределении памяти, потому что обычно она считается несуществующей страницей. Что касается указателя на отрицательный адрес, ваш компилятор отвечает за принудительное использование знака при генерации кода, если вы когда-либо имели опыт работы со сборкой, вы помните, что переменная неявно имеет знак (только инструкции присваивают ей это свойство). При доступе к области памяти в сборке адрес считается номером без знака.

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