C结构指针

时间:2014-10-15 12:26:50

标签: c pointers struct

我试图通过使用另一个指针

将结构分配给指针
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 *'

我做错了什么?

4 个答案:

答案 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 *,但表达式的类型 &categoryListCategory **,或者是指向指针的指针到Category“。这是你的第一种类型不匹配;作业应写成

Category *ap = categoryList;

最后,

*ap = (Category *)malloc(sizeof(Category));

表达式*ap的类型为Category; malloc会返回void *,您要投放到Category *。您不能将指针值分配给非指针类型,这是编译器错误的来源。该行应写成

ap = malloc( sizeof *ap );

演员表是不必要的 1 ,由于表达式*ap的类型为Categorysizeof *ap将提供与sizeof (Category) <相同的结果SUP> 2

<小时/> 1。演员在C ++和早期版本的C之前是必要的,早于1989年的标准 2. sizeof是一个运算符,而不是一个函数;唯一需要括号的时候是操作数是类型名称。