结构体指针避坑

本文档详细介绍了在C语言编程中遇到的结构体指针内存分配问题,特别是当尝试填充一个结构体指针字段时,如MAP消息体的`inLinks`字段。错误在于未在赋值前为指针分配内存,导致段错误。解决方案是使用`malloc`为`inLinks`分配内存,并初始化相关成员。相比之下,对于非指针结构体如`Link`中的`lanes`,可以直接赋值。通过对结构体指针和非指针结构体的赋值方式对比,加深了对C语言内存管理的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是在MAP消息填写时遇到的问题,结构体指针填入时,没有首先给结构体指针变量分配内存导致编译不通过。

MAP消息体结构如下图所示,其中实线框为必填项。

 起初按照最简单的方式填写,未报错,接下来开始填充inlinks字段后,疯狂报错,一直显示段错误,分析可能是内存分配问题,调试打印出错行后找到原因。

出错原因是mapNode中的LinklLst字段为结构体指针,但在赋值前没有先给inLinks变量分配内存,导致段错误。

mapNode变量定义如下:

typedef struct Node {
	DescriptiveName_t	*name	/* OPTIONAL */;
	NodeReferenceID_t	 id;
	Position3D_t	 refPos;
	struct LinkList	*inLinks	/* OPTIONAL */;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Node_t;

 加入如下第一行之后,可以成功给inLinks结构体指针赋值。

    mapNode->inLinks = (LinkList *)malloc(sizeof(LinkList));
    mapNode->inLinks->list.array = (Link_t **)malloc(sizeof(Link_t));
    mapNode->inLinks->list.array[0]=link;//???
    mapNode->inLinks->list.count = 1;
    mapNode->inLinks->list.size = 1;
    mapNode->inLinks->list.free=NULL;
    mapNode->name = NULL;
    mapNode->id.region=NULL;
    mapNode->id.id = 12;
    mapNode->refPos.lat = 310000000;
    mapNode->refPos.Long = 1210000000;
    mapNode->refPos.elevation = 0;

 与之对比可以参考Link中LaneList变量的赋值,由于LaneList是结构体,而非结构指针,所以不需要提前进行分配内存,就可赋值成功

typedef struct Link {
	DescriptiveName_t	*name	/* OPTIONAL */;
	NodeReferenceID_t	 upstreamNodeId;
	struct SpeedLimitList	*speedLimits	/* OPTIONAL */;
	LaneWidth_t	 linkWidth;
	struct PointList	*points	/* OPTIONAL */;
	struct MovementList	*movements	/* OPTIONAL */;
	LaneList_t	 lanes;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Link_t;
    Link_t *link = (Link_t *)malloc(sizeof(Link_t));
    memset(link, 0, sizeof(Link_t));
    link->name=NULL;// 
    link->upstreamNodeId.id=3;
    link->upstreamNodeId.region=NULL;
    link->speedLimits=NULL;
    link->linkWidth=1050;//
    link->movements=NULL;//暂时先没填
    link->points=NULL;    
    link->lanes.list.array=(Lane_t **)malloc(sizeof(Lane_t));
    link->lanes.list.array[0]=lane1;
    link->lanes.list.count=1;
    link->lanes.list.size=1;
    link->lanes.list.free=NULL; 

参考文献 

零基础入门C语言——结构体指针

结构体使用与指针的理解

结构体指针,C语言结构体指针详解 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值