2012-02-21 295 views
1

我有一個包含下面的代碼邏輯的遺留代碼:類型轉換爲unsigned long long到字符指針用C

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

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

這給了與海灣合作委員會的警告。

有人可以建議一些方法來將變量'地址'轉換爲char指針,以便它可以正確解碼,並且gcc不會給出警告嗎?

+0

我想說明一點,你應該使用'stdint.h'中的'intptr_t'或'uintptr_t'來存儲指針值爲整數。否則,您可能會失去精確度(或者,獲得精確度,當您轉換回來並可能導致類似問題時將丟失精度)。 – 2012-02-21 04:00:16

+0

如果沒有任何問題,克里斯,它不會是遺留代碼...作爲現代化工作的一部分,您的建議是明智的。我注意到,在這個問題中'const char *'強制轉換可能是不需要的,除非'some_char_buffer'實際上是'unsigned char'(或者更不可能是'signed char')。 – 2012-02-21 04:42:27

+0

@JonathanLeffler - 我有一個可怕的傾向,跳到代碼部分,我完全錯過了第一行中的「遺留代碼」。我覺得現在有點傻... – 2012-02-21 05:25:41

回答

-2

試試這個:

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

假設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)); 
+0

'NULL'('(void *)0')是一個空指針,ASCII NUL(''\ 0'')是C字符串的末尾。即使它們具有相同的價值,它們也不可互換。 – 2012-02-21 04:02:33

+0

@ChrisLutz完全正確,修正:) – 2012-02-21 04:19:11

2

你的代碼也許應該使用uintptr_taddress。 (我不認爲標準給出了保證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

+1推薦'uintptr_t' – 2012-02-21 04:01:11

+4

在第二個選項中通過'uintptr_t'強制轉換沒有實際好處。如果'address'中的值已被截斷,則爲時已晚。 – caf 2012-02-21 04:16:32

+0

好的好處是在第二個選項中關閉gcc,例如,如果你(無論是什麼原因)將'strtoull'的結果賦值給'address'變量。事實上,第一個('uintptr_t address = strtoul ...')將是首選,因爲一個演員可以被隱式轉換替換。 – 2012-02-22 06:37:31