如何解决为结构分配内存并写入结构的函数
我尝试为结构类型的变量分配内存,并使用函数写入变量。该函数正在读取XML文件并很好地完成其工作,但是从总体上来说,我只能获得一个正确的结构,其余的看起来像未初始化的变量。
我进行了编辑,希望我没有忘记什么。
我的结构如下:
typedef struct{
xmlChar *name;
int id;
}s_config;
我使用LIBXML2,其功能如下:
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
void read_xml(char *docname,s_config **cfgs,int *cfg_count){
int counter = 0;
*cfg_count = 2;
*cfgs = (s_config *) malloc( cfg_count * sizeof(s_config) );
doc = xmlParseFile(docname);
cur = xmlDocGetRootElement(doc);
cur = cur->xmlChildrenNode;
while (cur != NULL){
if(( xmlStrcmp(cur->name,(const xmlChar *)"config")))
cfgs[counter]->name = xmlGetProp(cur,"name");
counter++;
}
for(int i=0;i<cfg_count ;i++){
for(int j=0;j<6;j++)
printf("%x ",cfgs[i].name[j]);
printf("\n");
}
}
XML文件如下所示:
Root
->Node with name = "config"
-> atribut with name = "name"
-> data i want
->Node with name = "config"
-> atribut whit name = "name"
-> data i want
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config name="ffffffffffff"/><config name="1204567890A0"></config>
<configuration>
我的主像是这样:
int main(int argc,char **argv){
int number_of_cfgs;
s_config *cfgs;
read_xml(argv[1],&cfgs,&number_of_cfgs);
for(int i=0;i<number_of_cfgs;i++){
for(int j=0;j<6;j++)
printf("%x ",cfgs[i].name[j]);
printf("\n");
}
return 0;
}
我首先在主界面上打印的第一个结构是正确的,但是看起来都没有初始化变量。
解决方法
在main()
中:
s_config *cfgs;
read_xml(argv[1],&cfgs,&number_of_cfgs);
您传递cfgs
和number_of_cfgs
的地址,以便read_xml()
可以更改其值。这是正确的。
void read_xml(char *docname,s_config **cfgs,int *cfg_count){
*cfg_count = 2;
您将main的number_of_cfgs
设置为2。这是正确的(如果有些倒退)。
*cfgs = (s_config *) malloc( cfg_count * sizeof(s_config) );
在这里(及下面),您可能会使用cfg_count
(类型为int *
)而不是*cfg_count
(类型为int
)。这坏了。
假设您使用*cfg_count
,则为*cfg_count
/ number_of_config
结构数组分配内存,并将该内存的地址分配给*cfgs
。 cfgs
是main()
指针的地址,*cfgs
是该指针(现在指向分配的内存)。这是正确的。
cfgs[counter]->name = /* ... */
这在至少两种方式上是错误的。
-
您可以将
cfgs
作为指向结构的/指针的数组来处理,而实际上应该是*cfgs
。cfgs[0]
将(错误地)使用main()
(类型为cfgs
)的s_config *
的{{1}}(指针本身,类型为s_config
)占用的内存s_config
),它已经调用了UB。访问cfgs[1]
等只会使情况变得更糟。 -
您将
cfgs[counter]
(应为(*cfgs)[counter]
)用作指针(->name
)而不是结构(.name
)。
您所做的编辑使我对malloc()
没有.name
发生的评论过时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。