分配此嵌套结构的正确方法是什么?
What is the correct way to allocate this nested structures?
我在尝试弄清楚如何为此结构分配和释放内存时遇到了一些麻烦。
我需要用它来创建 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 调试它,似乎我总是访问一些我没有分配的地址。
此外,这是解除所有分配的正确方法吗?
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);
在您的释放示例中,Ftl
对象是一个 FiniteTableList
而不是指针 (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;
}
如果您想对分配的内存进行零初始化,可以将对 malloc
的调用替换为 calloc
我在尝试弄清楚如何为此结构分配和释放内存时遇到了一些麻烦。
我需要用它来创建 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 调试它,似乎我总是访问一些我没有分配的地址。
此外,这是解除所有分配的正确方法吗?
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);
在您的释放示例中,Ftl
对象是一个 FiniteTableList
而不是指针 (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;
}
如果您想对分配的内存进行零初始化,可以将对 malloc
的调用替换为 calloc