这是在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;