指向struct的指针与其数组数据成员之间不兼容的类型

时间:2011-07-12 13:52:37

标签: c arrays pointers struct

我是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;

错误如下:从类型'uint8_t *'

分配类型'uint8_t [6]'时出现不兼容的类型

5 个答案:

答案 0 :(得分:2)

这里有很多问题。

首先,请确保您的文件中包含#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;

如果有结构指针,则使用->操作数访问它的元素。所以,你的最后一行是:

pmyStruct->x=3;

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

#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不同。

祝你好运。

答案 1 :(得分: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;
}

答案 2 :(得分:1)

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

您只能以这种方式初始化数组。使用它就像声明它将导致错误。

您的问题与this post类似。

答案 3 :(得分:0)

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

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

但是你不能成为你结构的一员。

出于您的目的,只需使用循环

初始化它
 int i;
 for (i = 1;i<7;++i)
    pmyStruct->myArray = i;

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

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

(正如其他两张海报所指出的那样,你必须在做任何这些之前为你的结构分配空间,并在你完成时释放该空间)

答案 4 :(得分:0)

如果你想让事情变得简单,并且你不想处理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;
}