fprint与fprintf在C中

时间:2019-01-08 00:52:37

标签: c printf

我可以毫无问题地编译并执行此行:

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

任何人都可以解释这种行为吗?

1 个答案:

答案 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*应该可以正常工作。