【发布时间】:2017-11-11 19:02:25
【问题描述】:
我在试图弄清楚如何为这些结构分配和释放内存时遇到了一些麻烦。
我需要用它来创建在牛顿插值中使用的 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);
【问题讨论】:
-
什么是 valgrind 错误?如果涉及未定义的数据,请尝试使用
--track-origins=yes运行。 -
它用于“条件跳转或移动取决于未初始化的值”我有点知道它们在哪里,但我只需要知道如何简单地使用 malloc 启动所有这些结构
-
在这种情况下,
--track-origins=yes应该指向您需要修复的源代码位置。如果没有,则需要发布 valgrind 错误和相应的源代码。 -
@TomKarzes 哦,这里是错字。上的代码是正确的。