C语言使用%lu格式化uint64_t出现编译错误如何解决?
错误原因与修正方案
你代码里的报错由两个独立问题共同导致:
参数传递逻辑错误
scanf第二个参数需要传入待写入内存的指针:你定义的testInteger本身已经是uint64_t *类型,直接指向malloc申请的uint64_t存储空间,直接传testInteger即可,额外加&会得到uint64_t **类型的指针的指针,和要求的参数类型不匹配。printf需要传入要打印的uint64_t值,你传的testInteger是指针,需要加*解引用拿到指向的实际值,也就是传*testInteger。
格式符使用错误
不要直接用%lu匹配uint64_t,不同平台unsigned long的长度可能和uint64_t不一致,可移植性差。C标准库在<inttypes.h>头文件中专门定义了固定宽度整数的格式化宏:- 无符号64位整数的输入格式宏是
SCNu64 - 无符号64位整数的输出格式宏是
PRIu64
- 无符号64位整数的输入格式宏是
修正后的完整代码
#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <inttypes.h> // 必须引入该头文件才能使用上述格式宏 int main(void) { uint64_t* testInteger = malloc(sizeof(uint64_t)); scanf("%" SCNu64, testInteger); printf("%" PRIu64, *testInteger); free(testInteger); return 0; }
注:C语言会自动拼接相邻的字符串常量,所以把宏直接写在格式字符串的%后面即可正常使用。
内容的提问来源于stack exchange,提问作者Appley
相关产品推荐
相关产品推荐

