我可以毫无问题地编译并执行此行:
int whoami = i->whoami;
uint8_t * fetchPTR = &in[dataSize];
printf("%d, init fetch ptr = %08X\n",whoami, fetchPTR);
但是,我使用fprintf
收到此警告:
warning: format specifies type 'unsigned int' but the argument has type 'uint8_t *' (aka 'unsigned char *') [-Wformat]
这建议我改用%s
。
任何人都可以解释这种行为吗?
答案 0 :(得分:4)
%X
的大小严格来说是unsigned int
的大小,因此在sizeof unsigned int != sizeof uint8_t*
的任何机器上(例如,大多数64位机器),它都不会输出指针的整个值。 The %p
format code将打印指针大小正确的指针,因此可以使用它来打印内存地址。
要清楚,如下面的注释所述,即使sizeof unsigned int == sizeof uint8_t*
,这实际上也是未定义的行为;指针以类整数的方式存储在我所知道的所有现代硬件上,但是将来的某些系统可能会打破这种等同性,并且遵守语言标准是保证可移植性的唯一方法。同样,为了完全兼容,you should cast your pointer to void*
to print 和%p
专门与void*
一起使用,而不是“一般指针”;在怪异的系统(例如,具有近指针和远指针的分段存储系统,或针对不同指针类型的单独存储空间)上,uint8_t*
和void*
的存储或表示方式可能并不相同,但是强制转换为void*
应该可以正常工作。