在这个问题中,我会使用部分代码。所以你看我想解释的是什么。 我有这种结构,它有矩阵信息和位置。
typedef struct mylist {
struct mylist *link;
int **info;
int **position;
}Node;
稍后,我创建了链接列表(这部分代码在循环中),其变量为“matDim”(让我们假设在每个循环中变量是一个随机整数,循环重复100次)。
for(x = 0; x<100;x++){
srand(time(NULL));
int matDim = rand();
matrixA -> link = (Node*) malloc (sizeof (Node));
matrixA = matrixA -> link;
matrixA -> info = malloc(sizeof(int*)*(matDim));
matrixA -> position = malloc(sizeof(int*)*(matDim);
for(matCount = 0; matCount < (matDim); matCount++){
matrixA -> info[matCount] = malloc(sizeof(int)*(matDim));
matrixA -> position[matCount] = malloc(sizeof(int)*(matDim));
}
}
在此循环之前我也创建了
Node *matrixA = (Node*) malloc (sizeof (Node));
matrixA -> info = malloc(sizeof(int*)*(matDim));
matrixA -> position = malloc(sizeof(int*)*(matDim));
for(matCount = 0; matCount < (matDim); matCount++){
matrixA -> info[matCount] = malloc(sizeof(int)*(matDim));
matrixA -> position[matCount] = malloc(sizeof(int)*(matDim));
}
matrixA -> link = NULL;
Node *matrixB = matrixA;
我的问题是,如果您知道矩阵A的大小,那么如何在链接列表中释放已分配的内存?信息和矩阵 - &gt;每个循环中的位置都在变化(没有特定的模式)。根据我的理解,你必须释放每个矩阵A - &gt; info [x] [y]和matrixA - &gt;位置[x] [y]分别在每个节点中。
我想在结构中包含一个数组[100],以便存储大小,因为矩阵是正方形。但是,我在想是否有办法让程序找出矩阵的大小并释放矩阵的每个变量。
这是两个矩阵 - &gt;信息的示例(我只是将一些随机输入放入内存并在终端中像矩阵一样打印出来)
答案 0 :(得分:0)
当您在节点中分配大小不同的矩阵时,您必须存储此大小
有了这个,你就可以循环你的节点来解除分配你矩阵的每个单元格
根据您的代码,我认为您可以在节点结构中使用一个int
,这样您就可以完成所有free
。
答案 1 :(得分:0)
您可以在节点结构中添加matdim
元素,以便记住matDim
这是调整后的代码。我已经编译但没有测试它[请原谅无偿的样式清理]:
#include <malloc.h>
#include <time.h>
#include <stdlib.h>
typedef struct mylist {
struct mylist *link;
int matdim;
int **info;
int **position;
} Node;
int
main(void)
{
Node *matrixA;
int matDim;
int matCount;
int x;
srand(time(NULL));
matDim = rand();
matrixA = malloc(sizeof(Node));
matrixA->info = malloc(sizeof(int *) * matDim);
matrixA->position = malloc(sizeof(int *) * matDim);
// NOTE: now node can remember its dimensions
matrixA->matdim = matDim;
for (matCount = 0; matCount < matDim; matCount++) {
matrixA->info[matCount] = malloc(sizeof(int) * matDim);
matrixA->position[matCount] = malloc(sizeof(int) * matDim);
}
matrixA->link = NULL;
Node *matrixB = matrixA;
for (x = 0; x < 100; x++) {
matDim = rand();
matrixA->link = malloc(sizeof(Node));
matrixA = matrixA->link;
// NOTE: now node can remember its dimensions
matrixA->matdim = matDim;
matrixA->info = malloc(sizeof(int *) * matDim);
matrixA->position = malloc(sizeof(int *) * matDim);
for (matCount = 0; matCount < matDim; matCount++) {
matrixA->info[matCount] = malloc(sizeof(int) * matDim);
matrixA->position[matCount] = malloc(sizeof(int) * matDim);
}
}
return 0;
}
另外,我认为可能还有一两个错误(一个多余的malloc或两个?)。我注意到info
和position
总是&#34;并行&#34;。每当我看到这一点,我就开始思考&#34;新的结构&#34;,所以我记住了这一点。它可能[或可能不]满足您的需求:
#include <malloc.h>
#include <time.h>
#include <stdlib.h>
typedef struct _info {
int info;
int position;
} Info;
typedef struct mylist {
struct mylist *link;
int matdim;
Info **xinfo;
} Node;
int
main(void)
{
Node *matrixA;
int matDim;
int matCount;
int x;
srand(time(NULL));
matDim = rand();
matrixA = malloc(sizeof(Node));
matrixA->xinfo = malloc(sizeof(Info *) * matDim);
// NOTE: now node can remember its dimensions
matrixA->matdim = matDim;
for (matCount = 0; matCount < matDim; matCount++)
matrixA->xinfo[matCount] = malloc(sizeof(Info) * matDim);
matrixA->link = NULL;
Node *matrixB = matrixA;
for (x = 0; x < 100; x++) {
matDim = rand();
matrixA->link = malloc(sizeof(Node));
matrixA = matrixA->link;
// NOTE: now node can remember its dimensions
matrixA->matdim = matDim;
matrixA->xinfo = malloc(sizeof(Info *) * matDim);
for (matCount = 0; matCount < matDim; matCount++)
matrixA->xinfo[matCount] = malloc(sizeof(Info) * matDim);
}
return 0;
}