Типизирование Unsigned Long Long для указателя символов в C - PullRequest
1 голос
/ 21 февраля 2012

У меня есть устаревший код, который содержит следующую логику кода:

unsigned long long address; /* Its content = Some Address, not a normal value */

strcmp (address, (const char*)some_char_buffer);

Это выдает предупреждение с помощью gcc.

Может кто-нибудь предложить какой-нибудь способ типизации переменной 'address' вуказатель на символ, чтобы его можно было правильно декодировать, а gcc не выдает предупреждение?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Предполагая, что содержимое address на самом деле является просто указателем : Вы, вероятно, можете сделать:

strcmp ((char*)address, (const char*)some_char_buffer);

Но если это так, было бы гораздо лучше вместо этого изменить адрес на char* везде:

char* address; 

В зависимости от вашей кодовой базы это может быть большее изменение. Знаете ли вы, почему это был unsigned long long, а не указатель?


В качестве альтернативы, если вы хотите, чтобы байты содержимого address обрабатывались как строка : (а не содержимое, на которое может указывать address), выполните:

strcmp ((char*)&address, (const char*)some_char_buffer); // note the &

Обратите внимание, что в этом случае вам потребуется последний байт в длинной, равный '\0'. Если это то, что вы хотите сделать, я бы рекомендовал вместо этого использовать strncmp(), ограниченный размером длинного длинного:

strncmp((char*)&address, (const char*)some_char_buffer, 
        sizeof(unsigned long long));
2 голосов
/ 21 февраля 2012

Ваш код, вероятно, должен использовать uintptr_t для address. (Я не думаю, что стандарт дает гарантию, что unsigned long long имеет достаточно битов для хранения указателя, даже если это часто происходит на практике.)

uintptr_t address = ...;
strcmp((const char *)address, some_char_buffer);

или это или, если вы можете жить с безобразием,

unsigned long long address = ...;
strcmp((const char *)(uintptr_t)address, some_char_buffer);
0 голосов
/ 21 февраля 2012

Попробуйте это:

strcmp((char*)&address, (const char*)some_char_buffer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...