结构中char数组的奇怪字符

时间:2014-01-29 09:33:05

标签: c arrays char structure

以下是我的结构(在头文件中定义):

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不起作用。该函数返回结构,但值很奇怪......这不是值,而是奇怪的字符。

有什么想法吗? 感谢

3 个答案:

答案 0 :(得分:1)

您正在从Mini-XML分配给您自己的结构cmd的数据中制作副本。

例如,此语句复制指针,而不是实际字符:

cmd->UID = node_msgUID->child->value.opaque;

cmd->UID仍然引用Mini-XML分配的原始内存块。这没有什么不妥,只要记住,一旦你拨打mxmlDelete,这个记忆就会被取消分配。这可能是你在函数ParseFile末尾附近做的事情。我在这里猜测,因为你没有发布所有代码。

可能的解决方案:

  1. 而不是副本,制作副本,例如使用 strdup cmd->UID = strdup(node_msgUID->child->value.opaque);
  2. 在释放内存之前完成所有处理
  3. 请记住,您使用普通的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;
}