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结构体的指针),这样就能正确获取每个结构体的内容。
额外优化建议
- 检查文件打开状态:每次调用
fopen后一定要检查返回值,避免文件打开失败导致后续操作崩溃:
FILE* p2out = fopen("out.bin","wb"); if (p2out == NULL) { perror("文件打开失败"); return; }
- 修复排序函数的精度问题:
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
相关产品推荐
相关产品推荐

