定义一个结构体
typedef struct
{
uint32_t id;
uint8_t *data;
}ST_Msg;
由于不同id,对应的data长度不同,所以这里使用了指针。
然后定义结构体数组并初始化
const ST_Msg Msg_Pro[] =
{
{0x12345678,{1,1}},
{0x23456789,{2,2,2}},
};
这里这样写会报错,我目前的解决方法是新定义数组
uint8_t a[] = {1,1};
uint8_t b[] = {2,2,2};
然后把初始化修改为
const ST_Msg Msg_Pro[] =
{
{0x12345678,a},
{0x23456789,b},
};
这样可以正常编译,但是我想要的效果就是把id 和data的初始化的值放在一起,这样更加直观,所以想请问一下有没有什么方法能达到类似
const ST_Msg Msg_Pro[] =
{
{0x12345678,{1,1}},
{0x23456789,{2,2,2}},
};
这样初始化的效果?
应该不行。指针没有分配空间
你要改成uint8_t data[10];这样子才可以
typedef struct
{
uint32_t id;
uint8_t *data;
}ST_Msg;
这里的data是空指针,并没有开辟实际意义的内存
你可以在每一次使用的时候给data申请一次内存
因为你结构体中没有给data申请空间,直接赋值肯定出错。
const ST_Msg Msg_Pro[] =
{
{0x12345678,{1,1}},
{0x23456789,{2,2,2}},
};
这种写法是分配固定内存的写法。
typedef struct
{
uint32_t id;
uint8_t *data;
}ST_Msg;
这种则是动态内存的写法。
你想用固定内存的数据去给动态内存的结构赋值是无法实现的。只能用你中间的那种方式。
#define data1_id 0x12345678
unsigned char data1[] = {1, 1};
#define data2_id 0x23456789
unsigned char data2[] = {2, 2, 2};
typedef struct
{
unsigned int id;
unsigned char *data;
} ST_Msg;
const ST_Msg Msg_Pro[] =
{
{data1_id, data1},
{data2_id, data2}
};
不能像你那边为了直观这样定义。也可以用宏定义把ID和数据定义在一起,这样看着也很直观
定义一个数组,数组大小要大于最大可能的data长度
#define MAX_SIZE 255
typedef struct
{
uint32_t id;
uint8_t data[MAX_SIZE];
}ST_Msg;
const ST_Msg Msg_Pro[] =
{
{0x12345678,{1,1}},
{0x23456789,{2,2,2}},
};
{}是初始化列表,并不是数组,指针可以指向数组,或者说可以用数组初始化指针,但不能用初始化列表初始化指针