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

C语言代码未进入main函数问题排查求助

问题分析与修复方案

核心问题:栈溢出

你代码里的main函数在栈上定义了多个超大数组(比如Candidato candidatos[60000]、Colocados Colocado[60000]),而程序的栈内存空间通常只有几MB(Windows默认1MB,Linux默认8MB),这些数组的总大小远超栈的承载能力,导致程序在启动阶段(main执行前)就因栈分配失败崩溃,表现为“未进入main函数”。

具体修复步骤

1. 替换栈数组为动态内存分配

将栈上的大数组改为堆内存分配(malloc/calloc),堆的内存空间远大于栈,能容纳这些数据:

int main() {
    // 动态分配内存,检查分配是否成功
    Candidato *candidatos = malloc(sizeof(Candidato) * 60000);
    Curso *cursos = malloc(sizeof(Curso) * 5000);
    NaoColocados *NaoColocado = malloc(sizeof(NaoColocados) * 60000);
    Colocados *Colocado = malloc(sizeof(Colocados) * 60000);
    
    if (!candidatos || !cursos || !NaoColocado || !Colocado) {
        printf("内存分配失败\n");
        return 1;
    }
    
    int flag1, flag2, flag3, flag4, flag5;

    LerFaculdades(cursos);  // 数组名直接作为指针传递,无需取地址
    LerCandidatos(candidatos);
    ColocaOpcao1(candidatos, cursos, Colocado, NaoColocado, &flag1);
    
    printf("%d", flag1);
    
    // 释放动态分配的内存
    free(candidatos);
    free(cursos);
    free(NaoColocado);
    free(Colocado);
    
    return 0;
}

2. 修正函数调用的指针传递错误

原代码中LerFaculdades(&cursos)、LerCandidatos(&candidatos)等调用错误:数组名本身就是指向首元素的指针,传递&cursos会变成指向整个数组的指针,与函数参数的Curso*/Candidato*类型不匹配,导致内存访问错误。直接传递数组名即可。

3. 修复字符串比较逻辑

ColocaOpcao1中用==比较字符串是错误的,C语言中字符串比较必须用strcmp函数:

// 替换原条件中的 candidatos[k].curso1 == cursos[j].Cod_curso
if (strcmp(candidatos[k].curso1, cursos[j].Cod_curso) == 0 && candidatos[k].NotaCandidatura >= 10)

4. 修正循环边界错误

ColocaOpcao1中j的循环条件j < 50000超出了cursos数组的实际大小(5000),会导致越界访问内存,改为:

for (int j = 0; j < 5000; j++)

5. 补充文件句柄关闭

LerFaculdades函数中未关闭文件句柄fl,会导致资源泄漏,在函数末尾添加:

fclose(fl);

6. 修复ColocaOpcao1的提前返回逻辑

原函数中第一次循环就会return,无法处理所有候选人,需要移除不必要的return,调整为:

int ColocaOpcao1(Candidato *candidatos, Curso *cursos, Colocados *Colocado, NaoColocados *NaoColocado, int *flag1) {
    *flag1 = 0; // 默认初始值
    for(int k = 0; k < 60000; k++) {
        int placed = 0;
        for (int j = 0; j < 5000; j++) {
            if (strcmp(candidatos[k].curso1, cursos[j].Cod_curso) == 0 && candidatos[k].NotaCandidatura >= 10) {
                if (cursos[j].Vagas > 0) {
                    strcpy(Colocado[k].Curso, cursos[j].Nome_curso);
                    strcpy(Colocado[k].Instituicao, cursos[j].Nome_inst);
                    Colocado[k].NotaCandidatura = candidatos[k].NotaCandidatura;
                    Colocado[k].Opcao = 1;
                    Colocado[k].StudentID = candidatos[k].StudentID;
                    cursos[j].Vagas--;
                    placed = 1;
                    *flag1 = 1; // 只要有一个人被录取就设为1
                    break; // 找到匹配课程后退出内层循环
                }
                if (cursos[j].Vagas == 0) {
                    printf("hello\n");
                    placed = 1;
                    break;
                }
            }
        }
        if (!placed) {
            NaoColocado[k].NotaCandidatura = candidatos[k].NotaCandidatura;
            NaoColocado[k].StudentID = candidatos[k].StudentID;
        }
    }
    return *flag1;
}

其他注意事项

  • 确保CSV文件路径正确,程序能读取到文件;
  • 可以添加调试打印,确认每一步的执行情况;
  • 动态分配内存后必须检查是否成功,避免空指针访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:22:09