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

结构体中字符指针的初始化与访问:初始化触发段错误问题求助

解决结构体初始化时的段错误问题

咱们一步步排查你代码里的问题,以及对应的修复方案:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:45:49