2012-02-21 296 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