【发布时间】:2020-01-18 21:44:54
【问题描述】:
我的程序的简要概述:它包含大约 500 组初始参数的列表。然后它将这 500 个分成 50 个“块”,这样它就可以计算 50 个并将结果写入文件,然后转到下一个 50 个“块”,等等。这是一个检查点系统。无论如何,对于每个“块”,都会创建一个名为 calc_result 的结构数组来保存 50 个结果。每个calc_result 都包含一个名称、一个索引和一个用于实际结果的二维字符数组。然后工作完成并写入文件,当前的calc_result 数组被释放。这是基本程序:
typedef struct
{
char* name;
int index;
char** finals;
} calc_results;
int main(int argc, char** argv)
{
//read in sets of initial parameters
int numChunks = 10;
int calcsPerChunk = 50;
for(int i = 0; i < numChunks; i++)
{
calc_result** results = malloc(sizeof(calc_result*)*calcsPerChunk);
for(int j = 0; j < calcsPerChunk; j++)
{
results[j] = malloc(sizeof(calc_result));
results[j]->name = "blah";
results[j]->index = j;
results[j]->finals = malloc(sizeof(char*) * 12); //12 final results
for(int k = 0; k < 12; k++)
{
results[j]->finals[k] = malloc(70); //max string size is 70
}
}
//DO ACTUAL WORK
//WRITE RESULTS TO FILE
//FREE STUFF:
for(int a = 0; a < calcsPerChunk; a++)
{
for(int b = 0; b < 12; b++)
{
free(results[a]->finals[b]);
}
free(results[a]->name);
free(results[a]->finals);
free(results[a]);
}
free(results);
}
}
我无法释放结果。该程序运行了大约 10 个“块”中的 7 个,并运行了释放 calcsPerChunk 中的 1 个(即 i = 8、a = 1 和 b = 0),然后它抛出一个指向 free(results[a]->finals[b]) 的错误线。错误无用:“Program.exe”已触发断点。”我不确定我在这里做错了什么,有人可以帮忙吗?
【问题讨论】:
-
你不检查内存分配
malloc()是否成功。 -
free(results[a]->finals[b]);导致错误。 -
代码越来越长,所以我去掉了检查和 memset。分配内存时不报错。
-
free(results[a]->name);分配在哪里? (这是个大问题) -
@EsmaeelE -
results[j]->finals[k] = malloc(70)很好。sizeof (char)始终是1。
标签: c multidimensional-array memory-management heap-memory free