我试图通过使用另一个指针
将结构分配给指针typedef struct cat Category;
Category{
///some stuff here
};
Category *categoryList;
Category *ap = &categoryList;
*ap = (Category *)malloc(sizeof(Category));
我明白了:
error: incompatible types when assigning to type 'Category' from type 'struct Category *'
我做错了什么?
答案 0 :(得分:0)
您正在将指向结构类别的指针指定给指向结构类别的指针。是的,很多' tos'。那么如何解决呢?
typedef struct cat Category;
Category{
///some stuff here
};
// declare variable - pointer to category
Category *categoryList;
// store address of variable categoryList, which is pointer in variable ap,
// which needs to be of type Category ** since it is pointer to pointer!
Category **ap = &categoryList;
// assign pointer to mallocated address to categoryList whose address is
// accessed - dereferenced via *ap
*ap = malloc(sizeof(Category));
另请注意,您不应该转换malloc的返回值。有关说明,请参阅this answer
答案 1 :(得分:0)
使用指针数据类型(即Category*
)声明的变量有一个星号计数器,数据类型上的Asterisks个数。
就是这样,变量x
:
typedef struct category_t {
// ...
} Category;
Category* x;
x
有一个星级计数器= 1,因为你只有一颗星。
然后记住这个:
&
运算符将计数器增加一个。*
运算符会将计数器减一。然后,表达式:
&x
有星号计数器= 2和*x
有一个星号计数器= 0. 您始终需要匹配数据类型,包括星号计数器。
在您的示例中,您有两个错误:
Category *categoryList; // 1
Category *ap = &categoryList; // 2
*ap = (Category *)malloc(sizeof(Category)); // 3
在第2行,您的变量ap
的星号计数器= 1,但表达式&categoryList
的星号计数器= 2;这是一个无效的分配。
在第3行,您的变量ap
又有星号计数器= 1,但表达式*ap
有一个星号计数器= 0,而您正在分配malloc
的结果星级计数器= 1。
答案 2 :(得分:0)
#include <stdlib.h>
#include <stdio.h>
typedef struct {
// Some stuff here
} Category;
int main() {
// *categoryList doesn't initialize a struct, it only creates a pointer to one. Leave the * off.
Category categoryList;
// Assign the address of the categoryList struct to ap (a pointer)
Category *ap = &categoryList;
ap = malloc(sizeof(Category)); // Try to never cast malloc.
return 0;
}
答案 3 :(得分:0)
一次提出一个问题......
Category *categoryList;
变量categoryList
的类型是Category *
(指向Category
的指针)。
Category *ap = &categoryList;
变量ap
的类型是Category *
,但表达式的类型 &categoryList
是Category **
,或者是指向指针的指针到Category
“。这是你的第一种类型不匹配;作业应写成
Category *ap = categoryList;
最后,
*ap = (Category *)malloc(sizeof(Category));
表达式*ap
的类型为Category
; malloc
会返回void *
,您要投放到Category *
。您不能将指针值分配给非指针类型,这是编译器错误的来源。该行应写成
ap = malloc( sizeof *ap );
演员表是不必要的 1 ,由于表达式*ap
的类型为Category
,sizeof *ap
将提供与sizeof (Category)
<相同的结果SUP> 2
<小时/> 1。演员在C ++和早期版本的C之前是必要的,早于1989年的标准 2.
sizeof
是一个运算符,而不是一个函数;唯一需要括号的时候是操作数是类型名称。