Как сделать так, чтобы указатель void содержал то же содержимое, что и указатель структуры? - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь создать абстрактную версию хеш-таблицы, которая работает с указателями void. И я не могу заставить мои указатели содержать значения, которые указывали бы на другие структуры.

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

Стоит отметить, что у меня calloc память для пустых указателей, учитывая размер содержимого, которое я хочу поместить туда.

void *connectionInfoStructToPutInHashTable = commonHashTableArguments->connectionInfoStruct;
void *existingElementPointer = localSearchForExistingElement(commonHashTableArguments);
if(existingElementPointer == NULL){
    return;
}
int connectionInfoStructSize = commonHashTableArguments->connectionInfoStructSize;
  1. memset(existingElementPointer, 0, connectionInfoStructSize);

    memcpy(existingElementPointer, connectionInfoStructUpdated, connectionInfoStructSize);
    
  2. (*((int *)existingElementPointer)) = (*((int*)connectionInfoStructUpdated));

  3. *(void**)existingElementPointer = connectionInfoStructUpdated;

Я пытался использовать memcpy, ранее стирая все данные с места назначения, но это не сработало, и после приведения пустого указателя обратно я получил ошибку сегмента, получая доступ к указателям внутри указателя приведения.

Кроме того, я пытался указывать пустые указатели на указание на саму структуру (под номером 3 в коде), и она работала, но мне бы очень хотелось, чтобы мои указатели пустоты, являющиеся частью массива, имели необходимые, а затем освобождали эти части. памяти, которая мне не нужна.

P.s. части памяти, которые мне не нужны, это то, на что ссылается connectionInfoStructToPutInHashTable в коде. Как обертка для указателей на другие структуры.

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