这是我的结构(在头文件中定义):
typedef struct
{
char *name;
char *value;
} struct_param;
typedef struct
{
char *UID;
int number;
char *type;
char *name;
struct_param param[10];
} struct_cmd;
原型(prototype):
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不行。该函数返回结构,但值很奇怪......这不是值,而是奇怪的字符。
有什么想法吗? 谢谢
最佳答案
您正在对 Mini-XML 分配的数据进行浅复制到您自己的结构 cmd
。
例如,这个语句复制了一个指针,而不是实际的字符:
cmd->UID = node_msgUID->child->value.opaque;
cmd->UID
仍然指的是Mini-XML分配的原始内存块。这没什么问题,只要记住,一旦您调用 mxmlDelete,此内存将被取消分配。 .这可能是您在函数 ParseFile
末尾附近所做的事情。我在这里猜测,因为您没有发布所有代码。
可能的解决方案:
- 制作深副本,而不是浅副本,例如使用 strdup:
cmd->UID = strdup(node_msgUID->child->value.opaque);
- 在释放内存之前进行所有处理。
请记住,您是在没有垃圾收集器的情况下使用普通 C 进行编程。内存管理是您的责任。
关于c - 结构中 char 数组中的奇怪字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21426997/