2015-11-27 2 views
1

Я пытаюсь преобразовать строку, такую ​​как «0x7ffd01767a60» в шестнадцатеричный, чтобы я мог сравнивать указатели. Не уверен, что это лучшее решение.strtoul() работает не так, как ожидалось?

Я делаю это:

char *address = "0x7ffd01767a60"; 

    strtol(address,NULL,16); 
    printf("%lp",address); 

И я получаю это: 0x7ffd01764120

EDIT: Кажется, я печатал адрес строки, игнорируя возврат функции. Спасибо, Дженс! и schlenk.

РЕШЕННЫЙ! Это то, что я делаю

char *address = "0x7ffd01767a60"; 
    void *p; 
    unsigned long int address_hex = strtol(address,NULL,16); 
    p = (void*) address_hex; 

    printf("%p",p); 

printf печатает тот же адрес памяти.

+0

Где вы снимаете результат [strtoul] (http://linux.die.net/man/3/strtoul)? Все, что вы здесь делаете, это напечатать указатель на строку '" 0x7ffd01767a60 ", которая отличается от содержимого строки. – Jens

+0

Что вы ожидаете от этого? 'strtoul()' имеет возвращаемое значение, которое вы просто игнорируете. – schlenk

+0

lol ... теперь я понял. Спасибо. Должен ли я использовать длинный int? – deko

ответ

0

Вы печатаете адрес самой строки, игнорируя результат вызова функции strtoul(). Это должно работать:

const char *address = "0x7ffd01767a60"; 

unsigned long int address_hex = strtoul(address, NULL, 16); 
// Check for errors in errno 
printf("%lx\n", address_hex); 

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

Примечание: Прочитайте документацию по возвращаемому значению, чтобы убедиться, что вы правильно определяете ошибки.

+0

Эй, Дженс, это не позволит мне печатать это, разве это не будет% lu вместо% p, так как это длинный int? используя% lu Получаю: 140733653415520 – deko

+0

@deko: Правильно, мой плохой. Согласно документации [printf()] (http://linux.die.net/man/3/printf), тип для '% p' является типом указателя' void * ', но' address_hex' является целым числом , Использование '% lx' было бы правильным в вашем случае при условии, что вы ищете шестигранную распечатку; '% lu' приводит к десятичному значению. (Кроме того, я бы избегал бросать целое число в указатель, потому что вы могли столкнуться с проблемами на архитектурах, где ваша ширина указателя отличается от вашей (длинной) целочисленной ширины.) – Jens