2010-04-07 2 views
1

Я не могу понять этот результат ...Проблемы с использованием пустого указателя в качестве аргумента функции

Код:

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() выхода is:

[-1074593956] 

Мне действительно нужно key быть вольным id, как я могу это исправить?

ответ

3

Я думаю, что вам это нужно:

printf("[%d]\n", *(int*)key); 

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

+0

Да, я попробовал '(int *) * key', но не работал, и' * (int *) key' мне никогда не приходило в голову. –

2

Если вы указали указатель на int, вы получаете адрес в качестве значения. Вам нужно разыменовать указатели void, как и любые другие. Только вы не можете напрямую разыскивать void *, поэтому сначала вы должны направить его на указатель нужного типа, здесь int *. Затем разыщите этот указатель, т. Е. *((int *)key) (дополнительные круглые скобки для уточнения приоритета).

+0

Да, я попробовал '(int *) * key', но не работал, и' * (int *) key' мне никогда не приходило в голову. –

Смежные вопросы