printf格式的警告不适用于uint32_t类型的变量

sat*_*yam 7 c

我刚刚了解了C,我知道这是一个基本问题,但我无法弄清楚如何解决这个问题.例如,我有一行

printf("value :%d\n",var.value);
Run Code Online (Sandbox Code Playgroud)

格式不适合,因为它显示下面的错误

*格式'%d'需要类型'int',但参数3的类型为'uint32_t*'

我已经检查了cplusplus的参考:cplusplus print ref

但它没有明确说明如何打印类型为uint32_t*(同样uint16_t)的值.

任何解释都将非常感激.

nos*_*nos 16

您试图将指向uint32_t的指针打印为int.你必须做两件事:

  1. 取消引用指针,以便您可以打印uint32_t而不是指针.
  2. 使用正确的printtf格式说明符

格式化uint32_t的正确方法是使用宏PRIu32,它将字符串扩展为格式字符.

就是这样

printf("%"PRIu32"\n", *var.value);
Run Code Online (Sandbox Code Playgroud)

您可能在一个通用平台上,其中unsigned int与uint32_t相同,在这种情况下您可以这样做:

printf("%u\n", *var.value);
Run Code Online (Sandbox Code Playgroud)

(注意,%u代替使用%d的代码,%u代表unsigned int,而%d代表signed int)

  • @DevSolar否,传入变量参数函数的较小整数被提升为(unsigned)int.因此,如果int更大,则意味着uint32_t更小,然后它将被提升并且没有问题.这只是uint32_t大于int的问题. (2认同)
  • 请注意,您需要使用`#include <inttypes.h>`来使用`PRIu32`和类似的宏.有时候看看那个标题,如果你已经使用`uint32_t`作为可移植代码,那么你也应该使用`inttypes.h`中的`printf`格式说明符. (2认同)

Ste*_*end 5

如果你想使用指针%p,

printf("value :%p\n",var.value); 
Run Code Online (Sandbox Code Playgroud)

如果要使用解除引用的unsigned int

printf("value :%u\n",*(var.value)); 
Run Code Online (Sandbox Code Playgroud)

这假设value字段var实际上是指向的指针uint32_t- 这就是警告文本所暗示的内容.

很高兴你在这里得到一个警告 - printf不是类型安全的,所以经常误用API只会导致突然的运行时故障(例如崩溃或更糟,未检测到的内存损坏).