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
相关产品推荐
相关产品推荐

