电影评分管理程序size_t与int指针类型不兼容错误的解决
解决指针类型不兼容错误的方案
错误原因很明确:你在main里传递的是size_t*类型的指针(&n_items),但read_file函数的第二个参数定义为int*,两种指针类型不匹配,触发编译器警告。
方案1:统一使用size_t类型(推荐)
既然选择用size_t做计数(这更符合C语言处理对象数量的标准习惯),直接把read_file的参数类型改成size_t*,同步调整函数内相关用法:
修改后的代码示例:
#include <stdio.h> #include <stdlib.h> #include <assert.h> #define LMAX 100 // 需自行定义合适的数组大小 struct movie { char title[100]; float rating; }; int main(){ struct movie movie_list[LMAX]; size_t n_items = 0; read_file(movie_list, &n_items); } void read_file(struct movie movie_list[], size_t *ptr_n_items){ // 补充文件打开逻辑,需替换为你的实际文件路径 FILE *file = fopen("movies.txt", "r"); if (!file) { perror("Failed to open file"); exit(1); } int num = 5; // 示例值,实际需从文件或其他合法渠道获取条目数 for (size_t n = 0; n < num; ++n){ // 循环变量同步改为size_t,避免类型匹配警告 if (fscanf(file, "%[^\n]%*c", movie_list[*ptr_n_items].title) != 1 || fscanf(file, "%f%*c", &movie_list[*ptr_n_items].rating) != 1){ printf("ERROR: Wrong file format.\n"); exit(1); } *ptr_n_items += 1; } assert(*ptr_n_items == num); fclose(file); // 记得关闭文件 }
方案2:临时类型转换(不推荐,仅应急)
如果暂时不想修改函数参数类型,可在调用时做强制类型转换,但这种方式会隐藏类型不匹配风险,若size_t值超出int取值范围,会导致数据截断:
read_file(movie_list, (int*)&n_items);
不建议使用此方案,size_t是无符号类型,int是有符号类型,取值范围差异可能引发潜在bug。
额外注意事项
- 原代码中
num和file未定义,需补充文件打开逻辑和num的合法来源(比如从文件头读取条目数,或作为参数传入函数)。
内容的提问来源于stack exchange,提问作者user21494777
相关产品推荐
相关产品推荐

