GCC指针投射警告

时间:2011-12-14 17:05:08

标签: pointers gcc casting warnings

我想知道为什么海湾合作委员会给我这个警告:

test.h: In function TestRegister:
test.h:12577: warning: cast to pointer from integer of different size

代码:

#define Address   0x1234
int TestRegister(unsigned int BaseAddress)
{
    unsigned int RegisterValue = 0;
    RegisterValue              = *((unsigned int *)(BaseAddress + Address)) ;
    if((RegisterValue & 0xffffffff) != (0x0 << 0))
    {
            return(0);
    }
    else
    {
            return(1);
    }
}

3 个答案:

答案 0 :(得分:2)

可能是因为你在64位平台上,指针是64位但int是32位。

经验法则:不要尝试使用整数来存储地址。

答案 1 :(得分:1)

如果您包含<stdint.h>,并且使用gcc -Wall -std=c99编译for the C99 standard,则可以转换为intptr_t,这是一个与指针大小相同的整数类型。< / p>

RegisterValue = *((unsigned int *)((intptr_t)(BaseAddress + Address))) ;

答案 2 :(得分:0)

除此之外,你假设一个指针适合unsigned int,其中C给没有这样的保证 ......有一些今天使用的平台,这是不真实的,显然包括你的。

指向数据的指针可以安全地存储在(void*)或(类型*)中。指针可以添加到(或减去产生)size_tssize_tsizeof(int)sizeof(size_t)sizeof(ssize_t)(void*)或(*类型)之间没有保证的关系......

(另外,在这种情况下,初始化var并在下一行覆盖它没有实际意义......)

也不相关,但您意识到!= (0x0 << 0)!= 0并且可以省略,因为if (x) = if (x != 0) ...?也许这是因为这是从较大的样本中减少的,但整个例程可以表示为

   int TestRegister (unsigned int* BaseAddress)
     { return ( (0xffffffff & *(BaseAddress + Address)) ? 0 : 1 ); }

(编辑:更改为unsigned int*,因为他似乎更有可能跳过int大小的偏移?)