扫描与打印uint64_t(unsigned long long)时遇问题求助
问题解决:uint64_t 的扫描与打印错误
你的代码存在两个核心问题,以下是具体分析和修复方案:
1. scanf 参数类型不匹配
ptr 本身是 uint64_t* 类型(指向 malloc 分配的内存空间),但你传递了 &ptr,这是 uint64_t** 类型(指向指针的指针),和格式符要求的指针类型完全不匹配,这是触发编译器报错的直接原因。
2. 格式符的标准性问题
虽然多数平台下 uint64_t 等价于 unsigned long long,但直接使用 %llu 并非标准做法。C 标准在 <inttypes.h> 头文件中定义了专门的格式宏,比如 SCNu64(用于扫描无符号64位整数)和 PRIu64(用于打印无符号64位整数),用这些宏可以保证代码在不同平台的兼容性。
修正后的代码
#include <stdio.h> #include <stdint.h> #include <stdbool.h> #include <stdlib.h> #include <inttypes.h> // 必须包含此头文件以使用标准格式宏 int main(void) { uint64_t *ptr = malloc(sizeof(uint64_t)); if (ptr == NULL) { // 增加malloc失败检查,避免空指针访问 fprintf(stderr, "内存分配失败\n"); return 1; } scanf("%" SCNu64, ptr); // 使用SCNu64,参数传递ptr而非&ptr printf("%" PRIu64 "\n", *ptr); // 使用PRIu64打印 free(ptr); return 0; }
关键改动说明
- 引入
<inttypes.h>头文件,获取标准格式宏的定义。 - 将 scanf 的参数从
&ptr改为ptr,匹配格式宏要求的指针类型。 - 用
SCNu64和PRIu64替代%llu,保证跨平台编译的正确性。 - 增加内存分配失败的检查,这是避免程序崩溃的必要编程习惯。
内容的提问来源于stack exchange,提问作者PaulB
相关产品推荐
相关产品推荐

