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

C语言结构体指针操作无编译报错却触发段错误问题求助

问题原因分析
  • 核心错误是你对未初始化的野指针直接进行解引用赋值:你定义的Coordonnees结构体中dbl和age都是指针类型,声明joueur变量后,这两个指针的取值是随机的,并没有指向合法的、当前进程可读写的内存空间,直接执行*joueur.dbl = 12、*joueur.age = 13属于访问非法内存,触发C语言的未定义行为。
  • 简化版代码能正常运行只是运气问题:未定义行为的表现不固定,刚好运行时joueur.dbl的随机值指向了一段进程有权限操作的内存,没有触发操作系统的内存访问拦截(段错误),但代码本身仍然是错误的,换编译环境、运行环境大概率也会崩溃。
修复方案

方案1:将结构体成员改为普通非指针类型(最适合当前场景)

如果不需要用指针存储地址,直接把成员改成基础类型即可,不需要额外内存分配:

#include<stdio.h>
typedef struct 
{
    float dbl;
    int age;
} Coordonnees;

int main()
{
    Coordonnees joueur;
    joueur.dbl = 12;
    joueur.age = 13;
    printf("dbl= %f ", joueur.dbl);
    printf("Age=  %d", joueur.age);
    return 0;
}

方案2:保留指针类型,提前为指针分配合法内存

如果确实需要使用指针,需要先调用malloc为每个指针分配对应大小的内存,使用完后用free释放避免内存泄漏:

#include<stdio.h>
#include<stdlib.h>
typedef struct 
{
    float *dbl;
    int *age;
} Coordonnees;

int main()
{
    Coordonnees joueur;
    // 为两个指针分别分配内存
    joueur.dbl = malloc(sizeof(float));
    joueur.age = malloc(sizeof(int));
    // 分配后判空,避免内存分配失败的异常情况
    if(joueur.dbl == NULL || joueur.age == NULL) {
        perror("malloc failed");
        return 1;
    }
    *joueur.dbl = 12;
    *joueur.age = 13;
    printf("dbl= %f ", *joueur.dbl);
    printf("Age=  %d", *joueur.age);
    // 释放申请的内存
    free(joueur.dbl);
    free(joueur.age);
    return 0;
}

内容的提问来源于stack exchange,提问作者Youssef Kessas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 04:18:03