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

C语言:结构体指针数组传入函数后值异常求助

问题原因与解决方案

核心错误:指针偏移逻辑错误

你在writeBinary函数里的指针操作完全搞错了:

printf("%s \n",(*Arr+i)->title);

Arr是game**类型(二级指针,指向指针数组的首地址),*Arr拿到的是数组里第一个game*指针。*Arr + i是把这个指针按game结构体的字节大小偏移i次,而不是去访问指针数组的第i个元素。指针数组里每个元素是game*,元素之间的间隔是sizeof(game*),和sizeof(game)完全不同,所以这种偏移会指向无效内存,读到的自然是垃圾值。

修正方法

把writeBinary函数里的循环代码改成下面这样:

for (int i = 0; i < 6;i++)
{
    printf("%s \n", Arr[i]->title);
    // 补充实际写入二进制文件的逻辑
    fwrite(Arr[i], sizeof(game), 1, p2out);
}

Arr[i]直接访问指针数组的第i个元素(也就是对应game结构体的指针),这样就能正确获取每个结构体的内容。

额外优化建议

  1. 检查文件打开状态:每次调用fopen后一定要检查返回值,避免文件打开失败导致后续操作崩溃:
FILE* p2out = fopen("out.bin","wb");
if (p2out == NULL) {
    perror("文件打开失败");
    return;
}
  1. 修复排序函数的精度问题:compGamesByPrice直接返回double差值会丢失精度,qsort要求比较函数返回int类型,应该改成比较后返回-1、0、1:
int compGamesByPrice(const void * a, const void * b)
{  
    game* p2first = *(game **)a;
    game* p2second = *(game **)b;
    if (p2first->price < p2second->price) return -1;
    if (p2first->price > p2second->price) return 1;
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:45:20