2017-11-11 1 views
0

이 구조체에 메모리를 할당하고 해제하는 방법을 파악하는 데 어려움을 겪고 있습니다.이 중첩 구조를 올바르게 할당하는 방법은 무엇입니까?

이 기능을 사용하여 Newton Interpolation에 사용할 FiniteTable을 만들어야합니다.

typedef struct{ 
    unsigned int empty; 
    float value; 
}FiniteTableValue; 

첫 번째 주먹은 진정한 가치를 지닌 종류의 노드입니다.

typedef struct{ 
    FiniteTableValue *column; 
    unsigned int length; 
}FiniteTableRow; 

FiniteTableRow는 FiniteTableValues의 배열을 유지합니다.

typedef struct{ 
    FiniteTableRow *row; 
    unsigned int length; 
}FiniteTable; 

FiniteTable은 FiniteTableRow의 배열을 유지합니다.

typedef struct{ 
    FiniteTable *tables; 
    unsigned int length; 
}FiniteTableList; 

FiniteTableList 내가 Valgrind의 그것을 debugg하려고 FiniteTable의

의 목록입니다 그리고 내가 항상 내가 할당하지 않은 일부 주소에 액세스 보인다.

또한이 방법으로 모두 할당을 해제 할 수 있습니까? 당신의 해제의 예에서

FiniteTableList *ftl ... 
    ... 
    for(int i = 0; i < ftl->length; i++){ 
    FiniteTable table = ftl->tables[i]; 
    for(int j = 0; j < table.length; j++){ 
     FiniteTableRow row = table.row[j]; 
     free(row.column); 
    } 
    free(table.row); 
    } 
    free(ftl->tables); 
    free(ftl); 
+0

valgrind 오류 란 무엇입니까? 정의되지 않은 데이터가 포함 된 경우'--track-origins = yes'로 실행하십시오. –

+0

"조건부 점프 또는 이동은 초기화되지 않은 값에 달려있다."나는 어디 있는지 알고있다. 그러나 내가 알아야 할 것은 malloc을 사용하여이 모든 구조체를 간단하게 초기화하는 것이다. – Felipe

+0

이 경우,'--track-origins = yes'는 고쳐야 할 소스 코드 위치를 가리켜 야합니다. 그렇지 않은 경우 valgrind 오류와 해당 소스 코드를 게시해야합니다. –

답변

1

Ftl 개체가 아니라 포인터 (FiniteTableList *)보다 FiniteTableList입니다. 당신이 원하는 경우

/* Assuming every table in the list will have num_rows rows and num_columns columns. */ 
FiniteTableList * 
allocate_table_list (int num_rows, num_columns, int num_tables) 
{ 
    FiniteTableList * res = malloc (sizeof *res); 
    res->tables = malloc (num_tables * sizeof (*res->tables)); 
    res->length = num_tables; 
    for (int t = 0; t < num_tables; t++) 
    { 
     FiniteTable table = res->tables[t]; 
     table.row = malloc (num_rows * sizeof (*table.row)); 
     table.length = num_rows; 
     for (int r = 0; r < num_rows; r++) 
     { 
      FiniteTableRow row = table.row[r]; 
      row.column = malloc (num_columns * sizeof (*row.column)); 
      row.length = num_columns; 
     } 
    } 
    return res; 
} 

당신이 대체 할 수있는 할당 된 메모리를 제로 초기화 :

FiniteTableList ftl ... 

당신이 뭔가를 할 거라고 FiniteTableList 구조에 대한 메모리를 할당하려면 : 나는 당신이 쓰는 의미 생각 malloc의 전화 번호 : calloc

+0

FiniteTableList * res = malloc (sizeof * res) 할 때 무엇을 할당하고 있습니까? ? – Felipe

+0

최상위 수준의 FiniteTableList 개체에 대한 메모리를 할당하고 있습니다. (sizeof * res) 표현식은 "포인터 res가 가리키는 유형의 크기"를 의미합니다. – Kyrill

관련 문제