【发布时间】:2016-03-24 12:40:59
【问题描述】:
我正在尝试将矩阵存储在 LinkedList 中。但是我遇到了一个错误,代码可以编译但无法运行。可能是关于内存分配,但我想不通。
我的结构是这样的:
typedef struct node {
int** matrix;
struct node *next;
} node;
struct node *head;
struct node *tail;
我尝试像这样初始化结构:
struct node *init(void) {
head = (struct node *) malloc(sizeof *head);
tail = (struct node *) malloc(sizeof *head);
head->next = tail;
tail->next = tail;
return head;
}
我有一个全是 1 的矩阵:
int **mat = (int **) malloc(N * sizeof(int *));
for (i = 0; i < N; i++) {
mat[i] = (int *) malloc(N * sizeof(int));
for (j = 0; j < N; j++) {
mat[i][j] = 1;
}
}
但是当我试图将它附加到列表中时,程序已经崩溃了。
我尝试这样追加:
struct node *l1;
l1 = init();
l1 = append(mat, "t1", N);
int** a3 = returnNode(0, l1);
最后,我的 append 和 returnNode 函数是这样的:
struct node *append(int** mat, char* name, int N) {
struct node *ptr;
struct node *t;
ptr = head;
while (ptr->next != tail)
ptr = ptr->next;
t = (struct node *) malloc(sizeof *t);
t->matrix = (int**) malloc(N * sizeof(int*));
int i,j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
t->matrix[i][j] = (int)malloc(N * sizeof(int*));
}
}
t->matrix = mat;
t->next = tail;
ptr->next = t;
return ptr;
}
int** returnNode(int index, struct node *ptr) {
int i;
struct node *t;
t = (struct node *) malloc(sizeof *t);
t = head;
for (i = 0; i < index; i++) {
t = t->next;
}
return t->matrix;
}
我做错了什么?
【问题讨论】:
-
"matrix" 通常是二维数组的同义词。如果这是您的意图,
int **之类的东西不是二维数组,不能用作一个数组。使用真正的 2D 数组使代码更清晰,分配/释放更直接。它还可以(!)增加性能。 -
'但是我得到一个错误,代码可以编译但不能运行' - 什么错误,为什么它不能运行?不清楚你在问什么......
-
在调试器下运行它时发现了什么?它走了多远?
-
"我从一个文本文件中获得了
N值。所以它应该是动态的,因为我使用的是int**" - 1) 使用标记! 2)这与我写的内容有何不同?您可以很好地动态分配多维数组。这里有各种各样的问答。只需使用type **之类的东西忽略那些 -
这只是关于在 C/C++ 中创建此类程序的一般说明。将代码分小块编写并不断运行。这避免了很多这个段错误和其他问题。许多问题来自于人们编写所有东西然后试图从那里开始工作而不是逐步开发。