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

无法将int64_t转换为const void*:C调用NASM后的文件写入问题

解决C中int64_t转const void*的指针类型转换问题

你之前尝试的几种写法都存在语法或逻辑错误:

  • const void *output_ptr = rp;:直接赋值会触发类型不匹配警告/错误,int64_t是整数类型,void*是指针类型,无法隐式转换。
  • const void *output_ptr = *(const void)rp;:语法错误,将整数转成void类型无意义,且解引用操作逻辑完全错误。
  • const void *output_ptr = *(const void *ptr)rp;:语法错误,类型转换写法违规,多余的ptr标识符导致代码无效。
  • *output_ptr = *(const void *ptr)rp;:语法错误+逻辑错误,output_ptr是const指针,不能修改其指向的内容,且转换写法完全不正确。

正确的转换方式

NASM返回的rp是存储了数组缓冲区地址的int64_t整数,你需要将这个整数强制转换为指针类型,推荐的安全写法为:

const void *output_ptr = (const void *)(intptr_t)rp;

其中intptr_t是C标准定义的可存储指针值的整数类型,用它做中间转换能保证代码的可移植性。如果你的平台确定是64位系统(int64_t和指针宽度一致),也可以直接简化为:

const void *output_ptr = (const void *)rp;

修正后的文件写入代码

整合正确转换逻辑后的完整代码示例:

// rp 是NASM返回的int64_t类型指针值
int64_t rp = ...;
const char *output_file = "output_file.bin";
size_t length = ...; // 数组元素个数,每个元素占8字节

FILE *fp = fopen(output_file, "wb");
if (fp == NULL)
    return -1;

const void *output_ptr = (const void *)(intptr_t)rp;
fwrite(output_ptr, 8, length, fp);

fclose(fp);

注意事项

  • 必须确保NASM返回的rp是有效的内存地址,且该内存区域具备可读权限,否则fwrite会触发未定义行为。
  • 如果是32位平台,int64_t宽度大于指针,直接转换可能截断高位,此时需确认NASM返回的地址在32位地址空间内,或改用int32_t存储指针值。

内容的提问来源于stack exchange,提问作者RTC222

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:53:26