1、在linux中,这种写法比较清晰
struct gpio_led_data {
u8 can_sleep; //如果定义了结构变量,则该成员占用1个字节
u8 blinking; //如果定义了结构变量,则该成员占用1个字节
};
struct gpio_leds_priv {
int num_leds; //如果定义了结构变量,则该成员占用4个字节
struct gpio_led_data leds[];
//相当于分配gpio_led_data leds结构指针,表示指向的是一个结构型数组,表达更加清晰;
//如果定义了结构变量,则该成员占用4个字节
};
struct gpio_leds_priv gpio;//占用8个字节
struct gpio_led_data led[4];//占用8个字节
int size;
int size1;
int size2;
int main(void)
{
gpio.num_leds=4;//假定有4个灯
size1=sizeof(struct gpio_leds_priv);//size1=8
size2=sizeof(struct gpio_led_data *);//size2=8
size=size1+size2;//size=16
gpio.leds[0]=led[0];gpio.leds[0].can_sleep=1;
gpio.leds[1]=led[1];gpio.leds[1].can_sleep=0;
gpio.leds[2]=led[2];gpio.leds[2].can_sleep=1;
gpio.leds[3]=led[3];gpio.leds[3].can_sleep=0;
}
仿真后的结果如下:
注意; 结构里用指针:gpio和led[4]占用16个字节;
2、如果将上面的改成指针,程序可读性不太好
struct gpio_led_data {
u8 can_sleep;//如果定义了结构变量,则该成员占用1个字节
u8 blinking;//如果定义了结构变量,则该成员占用1个字节
};
struct gpio_leds_priv {
int num_leds; //如果定义了结构变量,则该成员占用4个字节
struct gpio_led_data *leds;
//如果定义了结构变量,则该成员占用4个字节
//这里直接使用的是指针,但是我们只知道它指向一个结构,这个结构是什么,就不是很清晰了.
};
struct gpio_leds_priv gpio; //占用8个字节
struct gpio_led_data led[4];//占用8个字节
int size1;
int size2;
int main(void)
{
gpio.num_leds=4;
size1=sizeof(struct gpio_leds_priv);//占用8个字节
size2=sizeof(struct gpio_led_data) * gpio.num_leds;//占用8个字节
gpio.leds=&led[0];
gpio.leds->can_sleep=1;
gpio.leds=&led[1];
gpio.leds->can_sleep=0;
gpio.leds=&led[2];
gpio.leds->can_sleep=1;
gpio.leds=&led[3];
gpio.leds->can_sleep=0;
}
注意:结构里用指针:gpio和led[4]占用16个字节;
3、在stm32中,我们喜欢直接表达
struct gpio_led_data {
u8 can_sleep;//如果定义了结构变量,则该成员占用1个字节
u8 blinking; //如果定义了结构变量,则该成员占用1个字节
};
struct gpio_leds_priv {
int num_leds; //如果定义了结构变量,则该成员占用4个字节
struct gpio_led_data leds[4]; //如果定义了结构变量,则该成员占用8个字节
};
struct gpio_leds_priv gpio;//占用12个字节
int size1;
int size2;
int main(void)
{
gpio.num_leds=4;//假定有4个灯
size1=sizeof(struct gpio_leds_priv);//4个灯占用内存为12个字节
size2=sizeof(gpio);//4个灯占用内存为12个字节
gpio.leds[0].can_sleep=1;
gpio.leds[1].can_sleep=0;
gpio.leds[2].can_sleep=1;
gpio.leds[3].can_sleep=0;
}
注意: 结构里不用指针: gpio占用12个字节;
这三种写法,不用指针,比较节省内存。