2017-11-11 334 views
0

我在尝试弄清楚如何为这个结构分配和释放内存时遇到了一些麻烦。分配这个嵌套结构的正确方法是什么?

我需要使用它来创建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然后保持FiniteTableRows的阵列。

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

FiniteTableList是FiniteTable的

我试着用的valgrind到debugg它的名单,似乎我一直访问我没有分配一些地址。

此外,这是正确的方式来释放所有?

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

在您的解除分配的示例对象FtlFiniteTableList而非指针(FiniteTableList *)。我觉得你的意思写:

FiniteTableList ftl ... 

要为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; 
} 

如果你想零初始化你分配可以替代内存拨打电话malloccalloc

+0

当你做FiniteTableList * res = malloc(sizeof * res); ? – Felipe

+0

您正在为顶层FiniteTableList对象分配内存。 (sizeof * res)表达式意思是“指针res指向的类型的大小” – Kyrill

相关问题