以前较少使用动态内存,好像没出过太大的问题;现在做的WNC的客户端通讯程序,用了不少动态内存的方法,结果由于没注意,害惨了自己。 typedef struct{ unsigned short wTagID;//位号标识ID char ComDataType;//实时数据的数据类型 uIDValue IDValue; }sWncCfg_RD_Sign; typedef struct{ WORD id_num; sWncCfg_RD_Sign *pWncCfg_RD_Sign; }sWncCfg_RD; int main() { sWncCfg_RD WncCfg_RD; sWncCfg_RD *pWncCfg_RD = &WncCfg_RD; // 注意1:由于下面使用realloc第一次创建动态内存,必须初始化pWncCfg_RD_Sign为 NULL,id_num为0 memset(pWncCfg_RD,0,sizeof(sWncCfg_RD)); // 注意2:由于id_num是0开始的,所以大小计算这里必须+1 pWncCfg_RD->pWncCfg_RD_Sign = (sWncCfg_RD_Sign *)realloc(pWncCfg_RD->pWncCfg_RD_Sign,sizeof(sWncCfg_RD_Sign)*(pWncCfg_RD->id_num+1)); if(pWncCfg_RD->pWncCfg_RD_Sign == NULL) { printf("WNC::malloc err, exit"); exit(0); } // 注意3:由于没注意,pWncCfg_RD_Sign = pWncCfg_RD_Sign + pWncCfg_RD->id_num +1,导致写操作了未分配的堆区,编译都是正常的,但在下一次malloc时出现段错误 pWncCfg_RD_Sign = pWncCfg_RD->pWncCfg_RD_Sign + pWncCfg_RD->id_num; pWncCfg_RD_Sign->ComDataType = ComDataType; pWncCfg_RD_Sign->wTagID = cfg_GetSign_TagID1(i); pWncCfg_RD->id_num++; }
阅读(1214) | 评论(0) | 转发(0) |