2012-05-03 3 views
1

У меня есть статический массив, и в функции я создаю новую структуру в цикле и присваиваю ее каждому индексу в массиве. В функции я вижу значения, но в другой функции я вижу мусор для значений массива. Должен ли я использовать malloc для чего-то вроде этого?Назначение структур статическому массиву

struct file_types 
{ 
    char * typename; 
    char * MIMEtype; 
}; 

static struct file_types *file_type_table; //Table of parameters 
static int file_type_table_num=0; 

int add_to_filetype_table(char *param, int param_len, char *value, int val_len, char* value2) 
{ if ((param == NULL) || (value==NULL) || (value2 == NULL)) 
     return 0; 
    if ((strcmp(param,"type") != 0) || (strcmp(value,"") == 0) || (strcmp(value2,"") == 0)) 
     return 0; 

    if (file_type_table==NULL) 
     file_type_table = emalloc(sizeof(struct file_types)); 
    else 
     file_type_table = erealloc(file_type_table, (file_type_table_num*sizeof(struct file_types)+ sizeof(struct file_types))); 

    file_type_table_num += 1; 
    int index = file_type_table_num -1; 

    struct file_types new_struct; 
    new_struct.typename = value; 
    new_struct.MIMEtype = value2; 

    file_type_table[index] = new_struct; 

    return 1; 
} 

Проблема в доступе к структур здесь:

char* get_table_value(char * key) 
{ logg("In get_table_value"); 
    int i; 

    char* value; 

    for (i=0;i<file_type_table_num;i++) 
    { 
     if (strcmp(((file_type_table)[i]).typename, key) == 0) 
     { 
      return (file_type_table[i]).MIMEtype; 
     } 
    } 
    return value; 
} 

ответ

2

Есть две проблемы в вашем коде:

Проблема 1:

Структура new_struct сама находится на стек и он будет освобожден после завершения действия функции. Так что ваши элементы массива указывают выходить за рамки функции - это нечто, чего не существует, ака мусора.

Решение:
структура должна находиться на динамической памяти, чтобы получить доступ за рамки.


Задача 2:

new_struct.typename = value; 
new_struct.MIMEtype = value2; 

Создает неполную копию указателей, передаваемой функции add_to_filetype_table(), Из примера не ясно, кто является владельцем указателей, передаваемых в function & Какова их продолжительность жизни. Если эти указатели освобождены до того, как вы вызовете get_table_value(), тогда ваша глобальная статическая структура останется с оборванными указателями, и, следовательно, вы получите значения мусора при выводе их.

Решение:

Вам нужно сделать Deep копия указателей передается.
Выделите память элементам структуры, а затем скопируйте (strcpy()) строки в выделенную память.

+0

Я установил new_struct (struct file_types * new_struct = emalloc (sizeof (struct file_types));), но я получаю ошибку сегментации, когда я делаю strcpy (new_struct-> typename, value). Если я только делаю «=», то у меня все еще есть оригинальная проблема. – user994165

+0

@ user994165: Вам нужно также «malloc» добавлять элементы указателя на структуру ('typename' и' MIMEtype')! Если вы просто выделяете память на указатель структуры, а не на элементы указателя, то членам структуры недостаточно памяти для хранения строк, которые вы копируете, используя 'strcpy'. –

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