You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

扫描与打印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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:54:16