我已经定义了一些结构,我创建了一个从XML读取数据并将其插入DialogueRules结构的函数。
一切都应该有效,但在执行之后,一些价值观仍然保持不变,即使他们应该这样做。我已经调试过,我发现它们设置正确,但是当我退出 dialog_load 功能时,它们会丢失它们的值。 (我跑了Valgrind并没有发现任何奇怪的事情)
经过更多的调试,我发现一些指针,比如dr-> l_topic [1] .name,指向main中的一个方向,指向 dialog_load 中的另一个指针,然后他们当我回到主要时,指向原始功能。
我没有一个关于它为什么失败的线索,原因是什么?
代码如下:
DialogueRules * dr=create_dialog(); //Reserve memory for the pointer
printf("t0: %d \n",dr->l_topic[1].name); //The pointer has the original value
dialogue_load("rules.xml",dr); //Loads the xml
printf("t2: %d \n",dr->l_topic[1].name); //The pointer has the original value
Dialogue_load是
STATUS dialogue_load(char * file_name,DialogueRules *dr){
printf("t1: %d \n",dr->l_topic[1].name);//The pointer has another value!
//Load the xml
xmlDocPtr doc;
xmlNodePtr node;
if (!file_name) {
return ERROR;
}
if ((doc = xmlParseFile(file_name))== NULL) {
fprintf(stderr,"File %s has not XML format.\n", file_name);
return ERROR;
}
node = xmlDocGetRootElement(doc);
if (node == NULL) {
fprintf(stderr, "Empty document\n");
xmlFreeDoc(doc);
return ERROR;
}
if (xmlStrcmp(node->name, (const xmlChar*) ROOT)) {
fprintf(stderr,"Expected <%s>, instead of %s\n", ROOT, node->name);
xmlFreeDoc(doc);
return ERROR;
}
node = node->xmlChildrenNode;
while(node != NULL) {
if (!xmlStrcmp(node->name, (const xmlChar*) RULES)) {
dreader_process_rules(doc, node->xmlChildrenNode, dr);
}
else if (!xmlStrcmp(node->name, (const xmlChar*) TOPICS)) {
dreader_process_topics(doc, node->xmlChildrenNode, dr);
}
node = node->next;
}
xmlFreeDoc(doc);
return OK;
}
Create_dialog是
DialogueRules *create_dialog() {
DialogueRules * dialog = (DialogueRules*)malloc(sizeof(DialogueRules));
dialog->num_rules=0;
dialog->num_topic=0;
return dialog;
}
结构如下:
typedef struct _Topic
{
Id id;
char name[WORD_SIZE+1]; /* topic name */
Set * topic_rules; /* set of rule indexes associated with a topic */
} Topic;
typedef struct _Rule
{
Id id; /* rule identifier */
char * pattern [MAX_PATTERNS];/* If the string matches any of these input patterns, then executes this rule */
int num_patterns;/* number of patterns */
char * template [MAX_PATTERNS]; /* List of pos sible templates that can be used as a response */
int num_templates; /* number of possible answers */
int last; /* Last used template */
} Rule;
typedef struct _DialogueRules
{
Rule l_rule[MAX_RULES]; /* vector to store rules */
int num_rules; /* number of rules stored in l_rule */
Topic l_topic[MAX_TOPICS]; /* vector to store topics */
int num_topic; /* number of topicsstored in l_topic */
} DialogueRules;
编辑:
使用%p时的输出是:
t0:0x7f57d20afe98
t1:0x7f57d20afe80
t2:0x7f57d20afe98
编辑2:
main的makefile规则是:
main.o: main.c
$(CC) ${CFLAGS} ${CXML2} -c main.c -o main.o
和dialoguerrulesreader(包含dialog_rule)是
DialogueRulesReader.o: DialogueRulesReader.c DialogueRulesReader.h
${CC} ${CXML2} -c $< ${LXML2}
(考虑到
CC=gcc -ggdb
CFLAGS=-Wall -pedantic -ansi
CXML2=`xml2-config --cflags`
LXML2=`xml2-config --libs`
)
答案 0 :(得分:1)
在评论中发现;你应该使用相同的CFLAGS
来构建所有单位。事实证明,在一个文件上使用不同的标志(特别是-ansi
,而在另一个文件上没有标准规范)导致结构在两个不同的单元中具有不同的大小。