预期’struct matrix_t *’但参数的类型为’struct matrix_t *’?_? 没有不同

main.c:78:25: erreur: assignment from incompatible pointer type [-Werror] main.c:81:9: erreur: passing argument 2 of 'matrix_multiply' from incompatible pointer type [-Werror] main.c:6:11: note: expected 'struct matrix_t *' but argument is of type 'struct matrix_t *' 

第6行是matrix_multiply函数

这是我的代码,从第74行开始

 matrix_t *m; matrix_t *first = matrix_reader_next(reader); matrix_t *previous = first; while ( (m = matrix_reader_next(reader))) { previous->next = m; previous = m; } matrix_t *result = matrix_multiply(first,first->next); 

这是我的函数原型和结构

 typedef struct { int **M; int nLi; int nCo; struct matrix_t *next; } matrix_t; matrix_t* matrix_multiply(matrix_t* first, matrix_t*second); matrix_t* matrix_reader_next(matrix_reader_t *r); 

我真的不明白这些错误信息。 请帮我 :)

您的类型定义应该是读

 typedef struct matrix_t { int **M; int nLi; int nCo; struct matrix_t *next; } matrix_t; 

否则,类型matrix_t引用完整但未命名的结构类型,而struct matrix_t引用您从未定义的不同的,命名但不完整的结构类型。

struct定义更改为:

 typedef struct matrix_t { int **M; int nLi; int nCo; struct matrix_t *next; } matrix_t; 

请注意区别?

struct matrix_ttypedef ... matrix_t ; 它们存在于不同的命名空间中; 因此,在您的代码版本中,编译器假定struct matrix_t *next指的是不同的不完整类型。

啊哈,你没有struct matrix_t但是next字段是使用struct标签声明的。 然后,只要使用next字段,就会出现问题。

matrix_t 可以是结构标记和类型名称,因为它们位于不同的名称空间中,但实际上,您的定义以…开头。

 struct { 

不…

 struct matrix_t { 

换句话说,你有一个未命名的结构,它有一个名为matrix_t的typedef,但你实际上从未定义过struct matrix_t.