1,以下代码是有问题的:
//file1.c里有如下代码
struct innrtc_t {
u8 it_works_timer;
u8 lose_effect_timer;
u16 target_temputer;
u16 wakeup_period;
u32 start_time;
u32 stop_time;
float line_slope;
};
void innrtc_init(struct innrtc_t *rtc)
{
innrtc->it_works_timer = 0;
innrtc->lose_effect_timer = 0;
innrtc->target_temputer = 0;
innrtc->wakeup_period = 0;
innrtc->start_time = 0;
innrtc->stop_time = 0;
innrtc->line_slope = 0.0;
}
//file2.c中有如下代码
struct innrtc_t *innrtc;
innrtc_init(innrtc);
这段代码不能初始化innrtc这个结构体成员,原因是因为初始化的这些值只是对指针赋值,并没有赋值到指针地址下的变量。innrtc相当于野指针。
2,下面的代码是正确的:
//file1.c代码不变
//file2.c代码如下
struct innrtc_t innrtc;
innrtc_init(&innrtc);
//或者
struct innrtc_t *innrtc;
innrtc = (struct innrtc_t *)malloc(sizeof(struct innrtc_t));
if(innrtc == NULL)
{
//... ...
}
innrtc_init(&innrtc);
// ... ...
free(innrtc);
我的理解:
1,如果定义一个结构体指针变量,就一定要为这个结构体指针变量赋值一个有效的地址,否则因为结构体指针变量地址不明确,那之后得到的结构体成员值也不明确。
2,定义结构体变量而不是指针不会出现问题的原因,定义结构体变量编译器会明确的把这个结构体变量分配到栈中,同样使用malloc来申请一块内存,编译器会明确的把结构体指针分配到堆中,这都是有效地址,所以不会出错。