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

