【问题标题】:incompatible types between pointer to struct and its array data member指向结构的指针与其数组数据成员之间的类型不兼容
【发布时间】:2011-07-12 13:52:37
【问题描述】:

我是 C 初学者,在编译以下内容时遇到错误:

typedef struct myStructType {
    uint8_t myArray[6];
    uint8_t x;
}myStruct;

myStruct *pmyStruct;

(*pmyStruct).myArray={1,2,3,4,5,6};   //getting error here
(*pmystruct).x=3;

错误如下:incompatible types when assignmenting to type 'uint8_t[6]' from type ‘uint8_t *’

【问题讨论】:

    标签: c arrays pointers struct


    【解决方案1】:

    这里有很多问题。

    首先,确保您的文件中有#include <stdint.h>,因为某些平台会出现 uint8_t 问题。

    其次,当你创建一个结构指针时,你必须为那个结构分配空间。这可以通过以下代码完成:

    myStruct *pmyStruct = malloc(sizeof(struct myStructType));
    

    正如其他人所提到的,您在初始化数组时只能使用{1,2,3...}。因此,要将元素添加到数组中,您需要:

    for (int i = 0; i < 6; i++)
        pmyStruct->myArray[i] = i+1;
    

    当你有一个结构指针时,你可以使用-&gt; 操作数访问它的元素。所以,你的最后一行是:

    pmyStruct->x=3;
    

    最后,您需要一个 main 方法。把它们放在一起:

    #include <stdlib.h>
    #include <stdint.h>
    
    typedef struct myStructType {
        uint8_t myArray[6];
        uint8_t x;
    }myStruct;
    
    int main()
    {
        myStruct *pmyStruct = malloc(sizeof (struct myStructType));
    
        for (int i = 0; i < 6; i++)
            pmyStruct->myArray[i] = i+1;
    
        pmyStruct->x=3;
    
    return 0;
    }
    

    完成所有操作后,请务必使用free(pmyStruct); 释放分配的空间并注意大小写! pmystructpmyStruct 不同。

    祝你好运。

    【讨论】:

      【解决方案2】:

      当您使用 C99(uint8_t// comment 这么说)时,您可以尝试复合文字

      #include <inttypes.h>
      #include <stdlib.h>
      
      struct myStructType {
        uint8_t myArray[6];
        uint8_t x;
      };
      
      int main(void) {
        struct myStructType *pmyStruct;
        pmyStruct = malloc(sizeof *pmyStruct);
        if (pmyStruct) {
          *pmyStruct = (struct myStructType){{1, 2, 3, 4, 5, 6}, 3}; // <== THIS
          free(pmyStruct);
        }
        return 0;
      }
      

      【讨论】:

        【解决方案3】:

        (*pmyStruct).myArray={1,2,3,4,5,6};

        您只能以这种方式初始化数组。声明后这样使用会报错。

        您的问题类似于this post

        【讨论】:

          【解决方案4】:

          一个数组可以在声明时初始化,所以你可以:

          int myarr[] = {1,2,3,4,5,6};
          

          但你不能将它作为你的结构的成员来做到这一点。

          出于您的目的,只需使用循环对其进行初始化

           int i;
           for (i = 1;i<7;++i)
              pmyStruct->myArray = i;
          

          (注意(*pmyStruct).myArray可以使用箭头符号pmyStruct-&gt;myArray

          对于更一般的数字集,可以使用 memcpy() 代替 for 循环

          (正如其他两个海报所指出的,您必须在执行任何操作之前为您的结构分配空间,并在完成后释放该空间)

          【讨论】:

            【解决方案5】:

            如果你一开始想保持简单,又不想处理mallocfree,你也可以先创建一个struct-object,然后用数据填充它,然后设置指向它的指针:

            #include <stdio.h>
            #include <stdlib.h>
            #include <stdint.h>
            
            typedef struct myStruct {
                uint8_t myArray[6];
                uint8_t x;
            } myStruct_t;
            
            int main()
            {
               //create obj
               myStruct_t myObj;
            
               //fill it with data
               myObj.myArray[0] = 1;
               myObj.myArray[1] = 2;
               myObj.myArray[2] = 3;
               myObj.myArray[3] = 4;
               myObj.myArray[4] = 5;
               myObj.myArray[5] = 6;
            
               myObj.x = 3;
            
               //set a pointer to it
               myStruct_t *pObj = &myObj;
            
               return 0;
            }
            

            【讨论】:

              猜你喜欢
              • 2020-10-11
              • 2021-06-06
              • 2017-03-09
              • 2018-10-14
              • 1970-01-01
              • 2011-12-16
              • 1970-01-01
              • 2023-03-27
              • 2018-11-23
              相关资源
              最近更新 更多