结构体指针数组动态申请内存?

Andy_xiaoyang 2014-08-08 04:42:40
typedef struct OperCommonNode
{
CString name;
CString RL;
CString UD;
CString display;
}OPER_COMMON_NODE,*P_OPER_COMMON_NODE;

typedef struct FuncNode
{
int id;
int flag;
OPER_COMMON_NODE *OCN[2];
}FUNC_NODE,*P_FUNC_NODE;

void CParseXMLDlg::SaveFuncParaMes( struct FuncNode *func,CMarkup xml )
{

//memset(func,0x00,sizeof(FuncNode));
func->id = _ttoi(xml.GetAttrib(_T("ID")));
func->flag= _ttoi(xml.GetAttrib(_T("Flag")));
//func->OCN[0] = (OPER_COMMON_NODE*)malloc(sizeof(OPER_COMMON_NODE));


func->OCN[0]->name = xml.GetAttrib(_T("Name1"));//运行到这里就会出错:

//ParseXML.exe 中的 0x780cedee (mfc100ud.dll) 处有未经处理的异常: 0xC0000005:
//读取位置 0xcdcdcdc9 时发生访问冲突


}
...全文
696 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Andy_xiaoyang 2014-08-11
  • 打赏
  • 举报
回复
好吧,谢谢各位的好心帮助,分配内存的那地方我调试时确实分配了,但粘贴的时候不小心注释掉了,后来我把结构体中的CString 全部换成char* ,分配了就没出问题,那应该就是结构体含有cstring 不能用malloc 这类,谢谢大家。
昨夜无风 2014-08-10
  • 打赏
  • 举报
回复
OPER_COMMON_NODE *OCN[2]; func->OCN[0]->name = xml.GetAttrib(_T("Name1")); ====================== 明显是因为OCN你没分配内存就使用了
GoldenSword 2014-08-09
  • 打赏
  • 举报
回复
CString是动态分配内存的,放在结构体里面再动态分配会有问题,建议直接用vector存放结构体
lis2012 2014-08-09
  • 打赏
  • 举报
回复
为结构体添加 构造函数(里面申请内存控件)和析构函数(释放内存空间),这样就不用外部申请了
Saleayas 2014-08-08
  • 打赏
  • 举报
回复
OCN[0] 没有分配。
Sandrer 2014-08-08
  • 打赏
  • 举报
回复
再想了想,我还是觉得你的问题不在于有没有初始化,而是你有没有 new 了 因为对于一个类来说,你把它定义出来后(不是指针,而是普通的变量),它会在构造函数中自动进行初始化 再来看看你的结构体,里面的 CString 都不是指针,而是普通的变量 那么你的 OCN 被 new 出来后,结构体中的类变量已经被自动初始化了(你可以在 CString 的构造函数里设个断点看看,不过 CString 的构造函数有很多个,你每个设断点看看) 所以我还是觉得你的问题是你没有为 OCN new 一个 OPER_COMMON_NODE 的结构体 还有就是你说的出错的那段代码,是不是把 malloc 注释后出错还是没注释时出错?还是无论注释或不注释都出错?
Sandrer 2014-08-08
  • 打赏
  • 举报
回复
typedef struct FuncNode { int id; int flag; OPER_COMMON_NODE *OCN[2]; }FUNC_NODE,*P_FUNC_NODE; 我怀疑是你的 OCN 没有初始化吧??? 你的 OCN 是两个 OPER_COMMON_NODE 的指针,你确定你两个都 new 了? 你 new 了之后确定已经初始化了? 0xC0000005 我没记错的话应该是未授权的内存访问 在看看你的访问地址 0xcdcdcdc9,一般内存中出现 cd 的地方,都是一块未被初始化的内存 CString 对象照样可以用 memset 来初始化,不管是独立初始化还是当作是结构体成员 因为我自己试过,也暂时没发现有问题
encoderlee 2014-08-08
  • 打赏
  • 举报
回复
CString是类,不是纯数据的结构体,CString对象需要构造函数初始化 所以不能用malloc,要用new,memset也不能用。
Andy_xiaoyang 2014-08-08
  • 打赏
  • 举报
回复
好像是这样,我改了用char* ,可以通过,就是转换起来好麻烦,不过我其他的结构体中用到Cstring,只要没分配内存就可以直接赋值,当出现动态分配内存时候才会出错
赵4老师 2014-08-08
  • 打赏
  • 举报
回复
CString是对象,不是一段内存,不适合放在结构体内。

2,586

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧