2014-01-29 4 views
3

Вот мои структуры (определенные в заголовочном файле):Странные персонажи из массива символов в структуре

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[]);

Функция в гр файл:

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 отлично работает.

Теперь от основной функции:

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

Вы должны были сделать 'cmd = malloc (sizeof (struct_cmd))' или 'cmd = & var', где это сделано, вы probably читаете ina varible, который выходит за рамки – Deepthought

+0

Это не имеет смысла:' struct_cmd = * CMD; '. Вы присваиваете значение типу. Компилятор должен хотя бы предупредить об этом. Вы не показываете весь код? – user694733

+0

Без изменений. Я добавил его в функцию, которая заполняет и возвращает структуру и перед вызовом этой функции. В функции printf все еще работает, но не в основном проекте. – 10h02

ответ

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. Все операции до освобождение памяти.

Помните, что вы программируете на равнине C, без сборщика мусора. Управление памятью - ваша ответственность.

+0

Огромное спасибо, сэр! Вы правы, я вызываю mxmlDelete в конце функции ParseFile. Спасибо за совет. – 10h02

-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; 
} 
+0

Такая же проблема ... – 10h02

+0

Ваш совет имеет смысл для нескалярных типов. Для указателя типа 'cmd' он не действует. За исключением того, что вы создаете глобальную область действия cmd, что является плохой практикой. –

0

Просто, чтобы быть уверенным ... Я должен использовать таНос перед установкой значения в моей структуре в функции ParseFile, правильно?

Как я уже сказал в комментарии, если я вручную установил cmd-> type = "type" в функции ParseFile, он будет правильно показан на консоли (в основном).

Но если это не так, отображаются странные символы.

Я изменил объявление своей структуры и добавил «extern», но ничего не изменил.

Я заблудился ...

Смежные вопросы