类型转换为unsigned long long到字符指针用C
我有一个包含下面的代码逻辑的遗留代码:类型转换为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不会给出警告吗?
试试这个:
strcmp((char*)&address, (const char*)some_char_buffer);
假设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));
'NULL'('(void *)0')是一个空指针,ASCII NUL(''\ 0'')是C字符串的末尾。即使它们具有相同的价值,它们也不可互换。 – 2012-02-21 04:02:33
@ChrisLutz完全正确,修正:) – 2012-02-21 04:19:11
你的代码也许应该使用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);
+1推荐'uintptr_t' – 2012-02-21 04:01:11
在第二个选项中通过'uintptr_t'强制转换没有实际好处。如果'address'中的值已被截断,则为时已晚。 – caf 2012-02-21 04:16:32
好的好处是在第二个选项中关闭gcc,例如,如果你(无论是什么原因)将'strtoull'的结果赋值给'address'变量。事实上,第一个('uintptr_t address = strtoul ...')将是首选,因为一个演员可以被隐式转换替换。 – 2012-02-22 06:37:31
我想说明一点,你应该使用'stdint.h'中的'intptr_t'或'uintptr_t'来存储指针值为整数。否则,您可能会失去精确度(或者,获得精确度,当您转换回来并可能导致类似问题时将丢失精度)。 – 2012-02-21 04:00:16
如果没有任何问题,克里斯,它不会是遗留代码...作为现代化工作的一部分,您的建议是明智的。我注意到,在这个问题中'const char *'强制转换可能是不需要的,除非'some_char_buffer'实际上是'unsigned char'(或者更不可能是'signed char')。 – 2012-02-21 04:42:27
@JonathanLeffler - 我有一个可怕的倾向,跳到代码部分,我完全错过了第一行中的“遗留代码”。我觉得现在有点傻... – 2012-02-21 05:25:41