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

