结构体中字符指针的初始化与访问:初始化触发段错误问题求助
解决结构体初始化时的段错误问题
咱们一步步排查你代码里的问题,以及对应的修复方案:
1. 段错误的核心诱因:未检查malloc返回值
你代码里最可能触发段错误的原因是:malloc内存分配失败时会返回NULL,但你完全没做失败检查,直接用这个NULL指针调用fgets写入数据,这会直接触发内存访问错误。
修复代码:
char *tmpName = (char*)malloc(MAXSTRING * sizeof(char)); // 必须检查内存分配是否成功 if (tmpName == NULL) { fprintf(stderr, "内存分配失败!程序退出\n"); exit(EXIT_FAILURE); // 需包含<stdlib.h>头文件 }
2. 隐藏的输入缓冲区问题(若启用注释的scanf)
如果你取消注释那行scanf("%10d", &id);,会出现一个隐性问题:scanf读取整数后,输入缓冲区会残留用户按下的换行符\n,后续的fgets会直接读取这个空换行符,而不是等待用户输入名字。虽然这不会直接引发段错误,但会导致程序行为不符合预期,后续操作空字符串也可能触发异常。
修复方法:在scanf后清空输入缓冲区
scanf("%10d", &id); // 清空缓冲区里的剩余字符(包括换行符) while (getchar() != '\n');
3. 优化fgets的输入结果
fgets会把用户输入的换行符\n也一并读取到字符串中,如果你不想保留这个换行符,可以手动去除:
fgets(tmpName, MAXSTRING, stdin); // 替换末尾的换行符为字符串结束符 tmpName[strcspn(tmpName, "\n")] = '\0';
4. 确保必要头文件齐全
你的代码用到了malloc、fgets、strcspn等函数,需要确保包含对应的头文件:
#include <stdio.h> #include <stdlib.h> #include <string.h> // 用于strcspn函数 #define MAXSTRING 256 typedef struct{ char *name; int id; }student;
把这些修复点整合后,你的代码就能正常运行,不会再出现段错误了。
内容的提问来源于stack exchange,提问作者Naoum Mandrelas
相关产品推荐
相关产品推荐

