【问题标题】:C structure pointerC结构指针
【发布时间】:2014-10-15 12:26:50
【问题描述】:

我正在尝试使用另一个指针将结构分配给指针

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 *'

我做错了什么?

【问题讨论】:

  • 需要使用ASCII解法
  • 首先:永远不要在c中强制转换malloc的返回值! ;)
  • 通过 *ap 你取消引用指针...
  • (*ap) 的类型是结构类别。
  • 很明显,OP 是 C 的新手。预计单个问题中会有两个或多个错误...因为当 Stack Overflow 成为专家提问的唯一场所?

标签: c pointers struct


【解决方案1】:

您正在将指向结构类别的指针分配给指向结构类别的指针。是的,这是很多“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

【讨论】:

    【解决方案2】:
    #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】:

      使用指针数据类型(即Category*)声明的变量有一个星号计数器,即数据类型上Asterisks 的编号。

      就是这样,变量x

      typedef struct category_t { 
      // ...
      } Category;
      
      Category* x;
      

      x 的星数计数器 = 1,因为您只有一颗星。

      然后记住这一点:

      • 使用&amp; 运算符将计数器加一。
      • 使用* 运算符将计数器减一。

      然后,表达式:

      • &amp;x 有一个星计数器 = 2,并且
      • *x 的星数计数器 = 0。

      您始终需要匹配数据类型,包括星号计数器。

      在您的示例中,您有两个错误:

      Category *categoryList;   // 1
      Category *ap = &categoryList; // 2
      *ap = (Category *)malloc(sizeof(Category)); // 3
      

      在第 2 行,您的变量 ap 的星号计数器 = 1,而表达式 &amp;categoryList 的星号计数器 = 2;这是一个无效的分配。

      在第 3 行,您的变量 ap 的星号计数器 = 1,但表达式 *ap 的星号计数器 = 0,而您分配的结果是 malloc 的星号计数器 = 1。

      【讨论】:

        【解决方案4】:

        一次解决一个问题...

        Category *categoryList;
        

        变量categoryList的类型是Category *(指向Category的指针)。

        Category *ap = &categoryList;
        

        变量ap 的类型是Category *,但表达式 &amp;categoryList 的类型是Category **,或“指向Category 的指针的指针”。这是您的第一个类型不匹配;作业应该写出来

        Category *ap = categoryList;
        

        最后,

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

        表达式*ap 的类型为Categorymalloc 返回一个 void *,您将其转换为 Category *。您不能将指针值分配给非指针类型,这是编译器错误的来源。那行应该写

        ap = malloc( sizeof *ap );
        

        强制转换是不必要的1,并且由于表达式*ap 的类型为Categorysizeof *ap 将给出与sizeof (Category) 相同的结果2


        1。在 C++ 和早于 1989 年标准的非常旧的 C 版本中,强制转换是必需的。
        2.sizeof是运算符,不是函数;唯一需要括号的情况是操作数是类型名称。

        【讨论】:

          猜你喜欢
          • 2021-05-03
          • 2021-04-11
          • 1970-01-01
          • 2021-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多