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

Итак, я работаю над небольшим пакетом выделения памяти, и я хотел, чтобы инициализация указателей сохраняла размер выделенного пространства, а также указывал, что он был выделен с помощью одной из моих функций (которая являетсясимвол «q» перед размером в памяти).Итак, я попытался сделать следующее:

int qmem_alloc(unsigned num_bytes, void ** rslt){
  *rslt = malloc(num_bytes+sizeof(int)+sizeof(char));
  *((int*)rslt) = num_bytes;
  *(char*)(rslt+sizeof(int)) = 'q';
  rslt = rslt+sizeof(int) + sizeof(char);
  if(*rslt == NULL)
    return -1;
  else if(errno != 0){
    //Catch the rest of the errors
    return -2;
  }
  return 0;
}

Однако в моей основной функции кажется, что память непосредственно перед адресом rslt не содержит того, что должна после передачи обратно.Я делаю что-то плохое, меняя адрес указателя?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

В вашей функции rslt - адрес указателя.Вы не должны изменять или даже получать доступ к этому.Если вы пытаетесь изменить / прочитать адрес, на который указывает указатель, вам нужно использовать * rslt .Если вы пытаетесь изменить / прочитать значение того, на что указывает указатель, вам нужно использовать ** rslt .

@ dbush описывает результат выше в коде.

0 голосов
/ 05 октября 2018

Вам не хватает уровня косвенности в нескольких местах.Везде, где вы используете rslt перед разыменованием, вы должны использовать *rslt:

int qmem_alloc(unsigned num_bytes, void ** rslt){
  *rslt = malloc(num_bytes+sizeof(int)+sizeof(char));
  if(*rslt == NULL)
    return -1;

  *((int*)*rslt) = num_bytes;
  *(char*)(*rslt+sizeof(int)) = 'q';
  *rslt = *rslt+sizeof(int) + sizeof(char);
  if(errno != 0){
    //Catch the rest of the errors
    return -2;
  }
  return 0;
}

Кроме того, память, возвращаемая malloc, правильно выровнена для любого использования.Потому что вы возвращаете sizeof(int)+sizeof(char) == 5 байт после этого (при условии 4 байта int), что означает, что указатель, который вы возвращаете, вероятно, не является.Вы захотите добавить как минимум еще 3 байта, чтобы вернуть возвращаемый буфер на 8-байтовую границу.

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