Проблема с использованием пустого указателя в качестве аргумента функции - PullRequest
1 голос
/ 07 апреля 2010

Я не могу понять этот результат ...

код:

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, чтобы быть пустым указателем, как это исправить?

Ответы [ 2 ]

4 голосов
/ 07 апреля 2010

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

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

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

2 голосов
/ 07 апреля 2010

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

...