【问题标题】:Matrix in Struct in CC语言结构中的矩阵
【发布时间】: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++ 中创建此类程序的一般说明。将代码分小块编写并不断运行。这避免了很多这个段错误和其他问题。许多问题来自于人们编写所有东西然后试图从那里开始工作而不是逐步开发。

标签: c matrix struct


【解决方案1】:

错误是:

从指针转换为不同大小的整数

t->matrix[i][j] = (int)malloc(N * sizeof(int*));

解决方法:-

在这里,您尝试将地址转换为整数值并将其分配给整数变量位置。

真正的问题在这里:

(int)malloc(N * sizeof(int*));

malloc 返回一个指针,您应该相应地转换它的类型并分别分配它。

【讨论】:

  • 我解决了。现在唯一的问题是“分段错误”
  • 分段错误意味着您超出了分配的内存。您能否输入导致该错误的代码的最小部分?
  • 我的代码是这样的。从“我有一个矩阵......”部分到“......最后......”我的问题部分是主要的。与内存分配无关
  • 即使在那个部分,您使用的是malloc,并且您正在使用循环来访问内存。另外,我建议使用free...
  • 请尝试调试您的代码并缩小您有段错误的地方。你可以只写printf 语句,看看你能走多远而不出错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多