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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:27:05