2015-12-06 3 views
-1

У меня есть следующий фрагмент кода:Как преобразовать указатели в целые числа и наоборот?

typedef Module * Ptr; 
producer(Ptr net) 
    Ptr Node; 
    Node = net; 
    pthread_mutex_lock(&mutex); 
    produce(q,(uint64_t)Node); 
    pthread_cond_signal(&cond); 
    pthread_mutex_unlock(&mutex); 

Здесь производят библиотека: продукт (Queue д, значение uint64_t)

Тогда у меня есть код потребителя:

consumer() 
    Ptr Node; 
    pthread_mutex_lock(&mutex); 
    while(!canConsume(q)) 
    { 
     pthread_cond_wait(&cond,&mutex); 
    } 
    Node = (Ptr)consume(q); 
    pthread_mutex_unlock(&mutex); 

Однако, когда я пытаюсь распечатать значение modNode в обеих функциях. Хотя Node в функциях производителя, по-видимому, является адресом, Node в функции пользователя оказывается равным 0. Я думаю, что я как-то испортил конверсию между указателями и целыми числами, потому что этот код отлично работает с передачей целых чисел. Мой вопрос: как преобразовать указатель в uint64_t?

+0

Что такое 'q'? Вы писали «потреблять» и «производить» себя? Вы уверены, что нет ошибок в 'потреблении' или' производстве'? – immibis

+3

Проблема может заключаться в том, что вы не знаете фактический размер указателя на каждой платформе, на которой вы будете строить. Поэтому старайтесь использовать ['(u) intptr_t'] (https://en.wikibooks.org/wiki/C_Programming/C_Reference/stdint.h#Integers_wide_enough_to_hold_pointers) всякий раз, когда можете. – StoryTeller

+0

Трудно сказать из вашего сообщения, но поскольку Node равен 0, когда вы его тестируете, а 0 обычно является эквивалентом значения NULL-указателя на C, я бы предположил, что на каком-то этапе ваша функция потребления() возвращает NULL. Возможно, очередь пуста. – StephenG

ответ

0

Чтобы преобразовать указатель на uint64_t, используйте оператор приведения:

(uint64_t)ptr 

При печати указателей с printf, вы хотите использовать %p форматирования спецификатора:

printf("%p\n", (void*)ptr); 

Не забудьте конвертировать ptr в void*, если ptr не является void* или char* или их квалифицированным вариантом.

+0

AFAICT, 'printf ("% p \ n ", ptr)' отлично [т.е. no cast needed] даже с '-Wall' и когда' ptr' является указателем на структуру –

+0

Нельзя использовать другой целочисленный тип для преобразования указателя, чем '(u) intptr_t'. Любое другое целое число не гарантирует, что значение указателя сохранится без изменений. – Olaf

+1

@CraigEstey: для вариационной функции вам нужно наложить указатель. Это единственное исключение из правила, чтобы никогда не приводить указатель на/из 'void *' в C. Если компилятор не предупреждает, это не гарантия, что у вас нет проблемы (желайте, чтобы это было так просто). – Olaf

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