C程序本地运行正常但学校远程评分服务器运行失败求助
问题根因
你的程序存在两处致命内存越界错误,本地运行无异常是因为不同环境的内存分配、对齐策略存在差异,越界访问未触发崩溃;学校远程环境的内存保护机制更严格,直接触发运行失败:
- 动态数组扩容触发条件错误
初始visited数组仅能存储1个int元素,你设置的扩容判断为i == arrSize - 1,第一次循环结束后i自增为1,此时arrSize - 1 = 0,不满足扩容条件,下一次循环直接往visited[1]写入数据,访问未分配的内存区域。 - realloc内存大小计算错误
realloc第二个参数为需要分配的字节数,你仅传入2 * arrSize,未乘以sizeof(int),实际分配的内存仅为需求的1/4(32位int环境下),后续写入直接越界。
可选优化点
你当前无论年份是否已经访问过,都会将年份存入visited数组,会导致数组存储大量重复年份,浪费内存,可调整为仅当年份未访问时才存入数组。
修复后代码
#include <stdlib.h> #include <stdio.h> #include <stdbool.h> struct movie { /** * 电影节点,存储标题、年份、语言、评分和下一个节点指针 */ char *title; char *year; char *languages; char *rating; struct movie *next; }; bool ifIn(int curYear, int *p, int size) /** * 辅助函数,判断年份是否已经被处理过 */ { for (int i = 0; i < size; i ++) { if (*(p + i) == curYear) { return true; } } return false; } void printHighestRated(struct movie *list) /** * 打印每一年评分最高的电影 * O(n²)时间复杂度遍历链表,用visited数组避免同一年份重复打印 */ { int *visited; int i = 0; int arrSize = 4; // 初始容量设为4,减少扩容次数 visited = calloc(arrSize, sizeof(int)); // 动态数组存储已处理年份 struct movie *head = list; // 保存头结点,每次遍历都从头开始 while (list != NULL) { int curYear = atoi(list->year); if (!ifIn(curYear, visited, i)) // 年份未处理时,查找该年最高评分电影 { char *ptr = NULL; struct movie *cur = head; double maxRating = strtod(cur->rating, &ptr); struct movie *maxMovie = cur; while (cur != NULL) { double curRating = strtod(cur->rating, &ptr); if (curRating > maxRating && atoi(cur->year) == curYear) // 找到同一年更高评分的电影 { maxMovie = cur; maxRating = curRating; } cur = cur->next; } printf("%s %s %s\n", maxMovie->year, maxMovie->rating, maxMovie->title); // 仅未处理的年份存入数组 if (i >= arrSize) { arrSize *= 2; visited = realloc(visited, arrSize * sizeof(int)); // 正确计算扩容后的字节数 } *(visited + i) = curYear; i ++; } list = list->next; } free(visited); }
内容的提问来源于stack exchange,提问作者Joe Caswell
相关产品推荐
相关产品推荐

