2012-05-03 10 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 자체가에 위치하고 있으며 스택 및 일단 함수의 범위를 끝내면 deallocated옵니다 그래서 배열 요소를 가리 킵니다 기능의 범위를 넘어서는 것은 존재하지 않는 것, 일명 쓰레기입니다.

해결책 : 구조가 힙 메모리에 상주해야
이 범위를 넘어 액세스 할 수있다.


문제 2 :

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

이 전달되는 포인터를 소유하고있는 사람이 분명하지 않다 예에서, 포인터의 함수 add_to_filetype_table()에 전달되는 단순 복사본을 만듭니다 함수 & 수명이 얼마입니까? get_table_value()을 호출하기 전에이 포인터를 할당 해제하면 전역 정적 구조에 포인터가 매달려 남습니다. 따라서 출력 할 때 가비지 값이 생깁니다. 그들.

솔루션 :

당신은 깊은 사본이 포인터의이 전달되는 확인해야합니다.
구조체 멤버에 메모리를 할당 한 다음 할당 된 메모리에 문자열을 복사하십시오 (strcpy()).

+0

new_struct (struct file_types * new_struct = emalloc (sizeof (struct file_types));)를 malloc했지만 strcpy (new_struct-> typename, value)를 수행 할 때 세그먼트 화 오류가 발생합니다. "="만하면 원래 문제가 남아 있습니다. – user994165

+0

@ user994165 : 구조체 포인터 멤버 ('typename'과'MIMEtype')를'malloc'해야합니다! 포인터 멤버가 아닌 포인터를 구조체에 할당하면 구조체 멤버는'strcpy'를 사용하여 복사 한 문자열을 저장할 수있는 메모리가 부족합니다. –