c - 在 C 中比较指针和整数可以吗?

标签 c pointers

我正在编写一些将虚拟地址映射到物理地址的代码。

我有这些代码:

if (address > 0xFFFF)
   Status = XST_FAILURE; // Out of range
else if (address <= 0xCFFF || address >= 0xD400) {
   // Write to OCM
   Xil_Out8(OCM_HIGH64_BASEADDR + OCM_OFFSET + address, data);
else { // (address >= 0xD000)
   // Write to external CCA
   Status = ext_mem_write(address, data);

我收到一个编译器警告: 指针和整数之间的比较[默认启用]

我意识到我正在比较两种不同的类型(指针和整数),但这是一个问题吗?毕竟,将指针与整数进行比较正是我想要做的。

定义指针常量来比较而不是整数会更清晰吗?

const int *UPPER_LIMIT = 0xFFFF;
...
if (address > UPPER_LIMIT ){
    ....

最佳答案

干净的方法是使用 uintptr_t 类型的常量,它被定义为一个无符号整数,可以在指针和整数之间唯一映射。

这应该由 #include <stdint.h> 定义.如果未定义,则表示您的编译器不遵循 C 标准,或者系统没有平面内存模型。

它旨在以“显而易见”的方式映射,即每个字节一个整数按升序排列。该标准并不能绝对保证这一点,但作为实现质量问题,很难看到其他任何事情发生。

例子:

uintptr_t foo = 0xFFFF;

void test(char *ptr)
{
    if ( (uintptr_t)ptr < foo )
         // do something...
}

这是由 C 标准明确定义的。您使用的版本 void *而不是 uintptr_t是未定义的行为,尽管如果您的编译器不太积极,它可能看起来有效。

关于c - 在 C 中比较指针和整数可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29040451/

相关文章:

c - 当用户输入 double 值时出现错误

perl - 有人可以解释 Perl 中的哈希吗?

c - 在代码中间定义变量可能会产生编译错误

使用指针创建结构

c++ - 减去指针 : Where does this missing level of indirection come from?

c - 引用指向另一个结构内部结构内部结构的指针

c++ - C++将指针传递给对象的指针,无法访问成员

c - 保存多个文件中使用的多个常量值

C float在传递给函数后重置为0

c - 如何在C中实现变量的dup函数