我是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]'时出现不兼容的类型答案 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);
释放分配的空间并注意大写! pmystruct
与pmyStruct
不同。
答案 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)
答案 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)
如果你想让事情变得简单,并且你不想处理malloc
和free
,你也可以先创建一个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;
}