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

C语言中函数外使用指针与malloc遇异常,输入输出代码问题排查求助

问题排查与修复建议

1. malloc分配空间不足,引发字符串越界

在GetInput函数中为姓名分配内存时:

*(Names+i) = malloc(strlen(temp1));

strlen(temp1)仅计算了字符串的有效字符长度,但C语言字符串需要额外1字节存储终止符'\0'。分配空间不足会导致strcpy写入超出内存范围,破坏其他变量(比如后续的分数指针或Names数组本身),触发未定义行为。

修复代码:

*(Names+i) = malloc(strlen(temp1) + 1); // 额外分配1字节存储'\0'

2. 分数数组指针偏移计算错误,导致内存越界

你的TestScoreArray是int[5][4]结构,每个学生对应4个分数,但代码中计算分数指针时错误使用了i*5的偏移量:

scanf("%d, %d, %d, %d", (PointerScore+(i*5)), ...);

这会让指针每次跳过5个int,而实际每个学生仅占4个int,最终会越界访问到TestScoreArray之外的内存(包括Names数组的存储空间),直接破坏姓名指针的存储,导致后续无法正确打印姓名。

修复代码:将偏移量改为i*4:

scanf("%d, %d, %d, %d", 
      PointerScore + i*4, 
      PointerScore + i*4 + 1, 
      PointerScore + i*4 + 2, 
      PointerScore + i*4 + 3);

3. 可选优化:清理输入缓冲区残留字符

使用scanf读取姓名后,输入缓冲区会残留换行符,可能干扰后续的分数读取。可以在读取分数前添加清理逻辑:

// 清除缓冲区中残留的换行符
while (getchar() != '\n');

4. 输出优化:添加换行提升可读性

当前打印姓名的循环没有换行,所有姓名会连在一起显示,建议修改为:

for (j = 0; j < 5; j++) {
    printf("%s\n", *(Names+j));
}

5. 完善内存回收,避免泄漏

记得在程序结束前释放malloc分配的内存:

for (j = 0; j < 5; j++) {
    free(Names[j]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:35:32