无法将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
相关产品推荐
相关产品推荐

