Вам не хватает уровня косвенности в нескольких местах.Везде, где вы используете 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-байтовую границу.