Problema usando o ponteiro vazio como um argumento de função
-
25-09-2019 - |
Pergunta
Não consigo entender esse resultado ...
O código:
void foo(void * key, size_t key_sz) {
HashItem *item = malloc(sizeof(HashItem));
printf("[%d]\n", (int)key);
...
item->key = malloc(key_sz);
memcpy(item->key, key, key_sz);
}
void bar(int num) {
foo(&num, sizeof(int));
}
E eu faço isso: bar(900011009);
Mas o printf()
A saída é:
[-1074593956]
Eu realmente preciso key
Para ser um ponteiro vazio, como posso consertar isso?
Solução
Eu acho que você precisa disso:
printf("[%d]\n", *(int*)key);
A chave é um ponteiro vazio para o INT, então você precisa primeiro lançar para um ponteiro int e depois desreferência para obter o Int original.
Outras dicas
Se você lançar o ponteiro para int
, você está recebendo o Morada como o valor. Você precisa desreferenciar indicações vazias como qualquer outra. Só você não pode desreferenciar diretamente void *
, então você deve primeiro lançá -lo para um ponteiro do tipo correto, aqui int *
. Então desreference aquele ponteiro, ou seja *((int *)key)
(Parênteses extras para esclarecer a precedência).