Проблема с использованием указателя пустота в качестве аргумента функции
-
25-09-2019 - |
Вопрос
Я не могу понять этот результат ...
Код:
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));
}
И я делаю этот звонок: bar(900011009);
Но printf()
Вывод:
[-1074593956]
мне очень нужно key
Быть пустотой указателем, как я могу это исправить?
Решение
Я думаю, что вам нужно это:
printf("[%d]\n", *(int*)key);
Ключ представляет собой пустотный указатель на INT, поэтому сначала нужно отбрасывать указатель INT, затем разыменовать, чтобы получить оригинал Int.
Другие советы
Если вы бросаете указатель на int
, вы получаете адрес как значение. Вам нужно разыраживать указатели пустоты, как и любой другой. Только вы не можете напрямую разыменовать void *
, Итак, вы должны сначала бросить его указатель правильного типа, здесь int *
. Отказ Тогда разыграть этот указатель, то есть *((int *)key)
(Дополнительные скобки для уточнения приоритета).