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

C语言中结构体数组未初始化出现异常数据填充问题求助

问题排查与解决方案

1. malloc未初始化导致垃圾数据

malloc 分配的内存是未初始化的,内存块里会保留之前程序遗留的随机垃圾值。你看到的 students.array[0].name 的异常数据就是这种垃圾值,其他字段刚好显示为空只是巧合。

解决方法:

  • 用 calloc 代替 malloc,它会自动把分配的内存初始化为0:
    students.array = calloc(100, sizeof(student));
    
  • 或者用 malloc 之后手动用 memset 初始化:
    students.array = malloc(sizeof(student) * 100);
    if (students.array != NULL) {
        memset(students.array, 0, sizeof(student) * 100);
    }
    

2. scanf("%[^\n]", fileName) 的潜在问题

这个 scanf 格式会读取直到换行符的所有字符,但如果输入缓冲区里之前残留了换行符,会导致直接读取空字符串。另外,它不会限制读取长度,输入超过100字符会触发缓冲区溢出。

建议替换为 fgets 安全读取文件名:

printf("Please enter file name:\n");
fgets(fileName, sizeof(fileName), stdin);
// 去掉fgets读取到的换行符
size_t len = strlen(fileName);
if (len > 0 && fileName[len-1] == '\n') {
    fileName[len-1] = '\0';
}

3. Fill_Contents 函数的传参问题

你当前传递的是 student_Array 的值拷贝,虽然修改数组元素内容是有效的,但如果后续需要扩容数组,修改无法同步到主函数。如果你的 Fill_Contents 不需要调整数组指针,当前传参没问题;若要支持扩容,建议传递指针:

Fill_Contents(contents, &students);

同时修改函数定义:

void Fill_Contents(char *contents, student_Array *students) {
    // 访问数组元素时用 students->array[i].name
}

4. 检查 Fill_Contents 的字符串分割逻辑

调用 Fill_Contents 后 array[0].name 数据异常,大概率是处理文件内容时出错:

  • 可能未跳过表头行,直接把 |NAME|... 分割后写入了 array[0]
  • 分割 | 分隔符时,出现字符串越界或截断错误

可以在 Fill_Contents 中添加调试打印,每分割一个字段就输出内容,验证是否符合预期。


内容的提问来源于stack exchange,提问作者Julius. P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:40:22