2013-07-17 4 views
0

이것은 어려운 부분을 배우면 문제가됩니다.중첩 구조 초기화

struct Address { 
     int id; 
     int set; 
     char *name; 
     char *email; 
}; 

struct Database { 
int rows; 
    struct Address *row; 
}; 

struct Connection { 
    FILE *file; 
    struct Database *db; 
}; 

나는 데이터베이스 구조를 초기화하는 -이 내가 세 가지 구조가 C 의 데이터베이스 관리 시스템입니다. 그러나 나는 segfault를 얻고있다.

void Database_create(struct Connection *conn, int no_of_rows) 
    { 
     int i = 0; 
    conn->db->row_num = no_of_rows; 

     for(i = 0; i < conn->db->row_num; i++) { 

     // make a prototype to initialize it 
     struct Address addr; 
     addr.id = i; 
     addr.set = 0; 

     // then just assign it 
     conn->db->rows[i] = addr; 
     } 
    } 

나는이 구조체에 메모리를 할당하는 다른 함수를 만들었다.

 struct Connection *Database_open(const char *filename, char mode) 
     { 
     struct Connection *conn = malloc(sizeof(struct Connection)); 
     if(!conn) die("Memory error"); 

    int number = conn->db->rows; 

     conn->db = malloc(sizeof(struct Database)); 
    if(!conn->db) die("Memory error"); 

     conn->db->row = malloc(sizeof(*conn->db->row) * number); 
     if(!conn->db->row) die("Memory error"); 

     if(mode == 'c') { 
     conn->file = fopen(filename, "w"); 
     } else { 
     conn->file = fopen(filename, "r+"); 

     if(conn->file) { 
     Database_load(conn); 
     } 
    } 

    if(!conn->file) die("Failed to open the file"); 

     return conn; 
    } 

Valgrind의 말한다 Database_open에서 "크기 4의 초기화되지 않은 값의 사용"()

사람이 내가 잘못 여기 일을 할 수있는 무엇을 제안 할 수 있을까요?

+0

''int' 일 때 왜'rows'를 배열로 사용하고 있습니까? – tay10r

+0

디버거를 사용하여 segfault의 원인을 확인하십시오. 가장 가능성있는'conn-> db'는 초기화되지 않았거나 뭔가가 없습니다. –

+0

@Ajit'Database_create'를 호출하는 방법을 포함해야합니다. – tay10r

답변

1

dbConnection 및 은 초기화되지 않은 포인터입니다. 당신은 그것들을 초기화하고 그것들이 가리키는 구조체를위한 저장소를 제공해야한다.

당신은 아마 가지고 Connection을 변경하여 일부 동적 할당을 절약 할 수의 Database으로 당신은 데이터베이스 행에 대해 메모리를 할당 할 필요가

struct Connection { 
    FILE *file; 
    struct Database db; 
}; 

회원이 아닌 포인터

conn->db.row = malloc(no_of_rows * sizeof(*conn->db.row)); 

Database_create 것 그런 다음 모양을 찾으십시오.

int Database_create(struct Connection *conn, int no_of_rows) 
{ 
    int i = 0; 
    conn->db.rows = no_of_rows; 
    conn->db.row = malloc(no_of_rows * sizeof(*conn->db.row)); 
    if (conn->db.row == NULL) { 
     /* out of memory */ 
     return 1; /* indicate failure to caller */ 
    } 
    for(i = 0; i < conn->db->rows; i++) { 
     conn->db.row[i].id = i; 
     conn->db.row[i].set = 0; 
    } 
    return 0; /* indicate success to caller */ 
} 

여기에 메모리가 이미 할당되어 있다고 가정합니다. Connection

+1

내가 잘못 읽은 것이 아니라면,'rows'는 포인터가 아니라 int입니다. – tay10r

+0

고마워, 나는'row' ('Address *')를 의미했다. 이제 – simonc

+0

을 수정 했으므로 코드에서 포인터로'rows'를 사용하고 있다는 것을 포함시킬 수도 있습니다 – tay10r