以下是我的结构(在头文件中定义):
typedef struct
{
char *name;
char *value;
} struct_param;
typedef struct
{
char *UID;
int number;
char *type;
char *name;
struct_param param[10];
} struct_cmd;
原型:
struct_cmd *ParseFile(char buffer[]);
c文件中的函数:
struct_cmd *ParseFile(char buffer[])
{
struct_cmd *cmd;
cmd = malloc(sizeof(struct_cmd));
...
if (mxmlGetFirstChild(node_msgUID) != NULL)
cmd->UID = node_msgUID->child->value.opaque;
...
printf("Message Type :: %s | Message UID :: %s \n", cmd->type, cmd->UID);
...
return cmd;
}
ParseFile中的printf运行良好。
现在,从主要功能:
int main(int argc, char **argv)
{
...
struct_cmd *mystruct;
mystruct = malloc(sizeof(struct_cmd));
mystruct = ParseFile(buf);
printf("Message Type :: %s | Message UID :: %s \n", mystruct->type, mystruct->UID);
...
}
相同的printf不起作用。该函数返回结构,但值很奇怪......这不是值,而是奇怪的字符。
有什么想法吗? 感谢
答案 0 :(得分:1)
您正在从Mini-XML分配给您自己的结构cmd
的数据中制作浅副本。
例如,此语句复制指针,而不是实际字符:
cmd->UID = node_msgUID->child->value.opaque;
cmd->UID
仍然引用Mini-XML分配的原始内存块。这没有什么不妥,只要记住,一旦你拨打mxmlDelete,这个记忆就会被取消分配。这可能是你在函数ParseFile
末尾附近做的事情。我在这里猜测,因为你没有发布所有代码。
可能的解决方案:
cmd->UID = strdup(node_msgUID->child->value.opaque);
请记住,您使用普通的C编程,没有垃圾收集器。内存管理是您的责任。
答案 1 :(得分:0)
只是为了确定...在ParseFile函数中将值设置为我的结构之前,我必须使用malloc,对吗?
正如我在评论中所说,如果我手动设置cmd-> type ="输入"在ParseFile函数中,它在控制台(主要)中正确显示。
但如果我不这样做,就会显示奇怪的字符。
我更改了我的结构声明并添加了#34; extern",但它没有改变任何内容。
我迷失了......
答案 2 :(得分:-1)
在函数中全局定义cmd而不是本地:
struct_cmd *ParseFile(char buffer[])
{
struct_cmd *cmd;
cmd = malloc(sizeof(struct_cmd));
...
if (mxmlGetFirstChild(node_msgUID) != NULL)
cmd->UID = node_msgUID->child->value.opaque;
...
printf("Message Type :: %s | Message UID :: %s \n", cmd->type, cmd->UID);
...
return cmd;
}
为:
struct_cmd *cmd;
struct_cmd *ParseFile(char buffer[])
{
cmd = malloc(sizeof(struct_cmd));
...
if (mxmlGetFirstChild(node_msgUID) != NULL)
cmd->UID = node_msgUID->child->value.opaque;
...
printf("Message Type :: %s | Message UID :: %s \n", cmd->type, cmd->UID);
...
return cmd;
}