我想知道为什么海湾合作委员会给我这个警告:
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);
}
}
答案 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_t
或ssize_t
。 sizeof(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
大小的偏移?)