Как правильно выполнить приведение для сравнения указателя с явным диапазоном адресов?

Я делаю malloc, а затем хочу проверить, находится ли результат malloc в моей оперативной памяти следующим образом:

char (*message)[];
message = malloc(data_index);
if(message != NULL && message >= 0x20000000 && message < 0x20030000){
  //do something
}

Это работает, но я получаю предупреждение: сравнение указателя и целого числа. Я бы хотел избавиться от этого предупреждения, но как? Предупреждение исчезает, когда я передаю целое число в char, но, очевидно, это ложное решение.

if(message >= (char)0x20000000) {

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

if(message >= (char**)0x20000000) {

Как получить активный оператор if без предупреждения?

Если вы работаете в системе с виртуальной памятью (в основном в каждой системе, подобной ПК за последние пару десятилетий), адреса, которые вы получаете malloc, не будут отражать фактическое физическое расположение памяти.   —  person Robin    schedule 21.10.2019

Связанный: stackoverflow.com/q/24212792/1025391   —  person Robin    schedule 21.10.2019

Более того, объявление message как указателя на массив неизвестного размера само по себе не имеет особого смысла и редко имеет смысл вообще (и строится ли он вообще?). И к вашему предупреждению, указатель на массив не того же типа, что и указатель на указатель.   —  person Robin    schedule 21.10.2019

Чего вы на самом деле пытаетесь достичь? Это похоже на проблему XY   —  person Robin    schedule 21.10.2019

Адрес памяти, разумеется, не может храниться в char типе и может не соответствовать int типу.   —  person Robin    schedule 21.10.2019

Я делаю malloc, а потом хочу проверить, находится ли результат malloc в моей RAM: возвращаемое значение malloc находится в вашей RAM, это точно и справедливо для любой реализации.   —  person Robin    schedule 21.10.2019

См. также:  Сопрограммы C ++: допустимо ли вызывать handle.destroy из последней точки приостановки?

Дубликат: «Указатель целого / целого числа из указателя без проблемы с трансляцией   —  person Robin    schedule 21.10.2019

Возможный дубликат Указатель целого / целого числа из указателя без проблемы с трансляцией   —  person Robin    schedule 21.10.2019

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Robin

    Вы, вероятно, захотите что-то вроде этого:

    char *message;
    message = malloc(data_index);
    if(message != NULL && message >= (char*)0x20000000 && message < (char*)0x20030000){
      // will do something
      // if message contains an address between 0x20000000 and 0x20030000
    }
    

    Имейте в виду, что это имеет смысл только на определенном оборудовании (вы не упомянули свою целевую систему).

    В современной настольной системе (Mac / Windows / Linux) это не имеет смысла, поскольку все адреса памяти виртуальные.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: