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

C语言给结构体指针成员赋值NULL出现段错误如何解决

问题原因

你触发段错误的核心原因是全局指针struct classe *alunos未指向任何合法分配的内存空间,直接使用->解引用野指针访问结构体成员,就会触发操作系统的内存越界保护,抛出段错误。

正确初始化方案

方案1:动态分配内存(适用于需要用指针管理结构体的场景)

首先引入stdlib.h头文件调用malloc分配对应大小的内存,分配完成后校验返回值再初始化成员:

#include <stdlib.h>

struct aluno
{
    char nome[80];
    float nota;
};

struct classe
{
    struct classe* aluno_anterior;
    struct classe* aluno_posterior;
    struct aluno aluno;
};

struct classe *alunos;

void inicializar_classe(void)
{
    // 先为结构体分配内存空间
    alunos = malloc(sizeof(struct classe));
    // 必须判断内存是否分配成功
    if (alunos == NULL) {
        // 分配失败可自行添加报错逻辑,此处直接返回为例
        return;
    }
    alunos->aluno_anterior = NULL;
    alunos->aluno_posterior = NULL;
}

注意:使用完该结构体后需要调用free(alunos)释放内存,避免内存泄漏。

方案2:直接定义结构体变量(适用于不需要动态管理生命周期的场景)

如果不需要动态分配内存,直接把alunos定义为结构体实例而非指针,内存会被静态分配,直接访问成员即可:

struct aluno
{
    char nome[80];
    float nota;
};

struct classe
{
    struct classe* aluno_anterior;
    struct classe* aluno_posterior;
    struct aluno aluno;
};

// 定义为结构体变量而非指针,默认分配内存
struct classe alunos;

void inicializar_classe(void)
{
    alunos.aluno_anterior = NULL;
    alunos.aluno_posterior = NULL;
}
补充说明

如果alunos是双向链表的头指针,后续新增链表节点时也需要先为每个新节点分配内存,再初始化对应的前后指针,避免重复出现野指针解引用的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:48:04