在一点思绪都没有的情况下,我习惯性的想到,会不会是没有分配好空间呢?
于是我在gcc下写了一个简单程序测试。 - typedef struct
- {
- void (*Test)();
- }pTest;
- #include
- #include
- void Helloworld(void)
- {
- printf("Helloworld.\n");
- }
- void main(void)
- {
- void (*pT)(void) = NULL;
- pTest *Str;
-
- Str = (malloc)(sizeof(pTest)*1);
-
- Str->Test = Helloworld;
-
- while(1)
- {
- if(Str->Test != NULL)
- pT = Str->Test;
- if(pT != NULL)
- (*pT)();
- }
- }
复制代码于是我发现,如果我首先做一个分配,就会出现和昨晚uS下一样的情况。
但是我想不明白有件事情。
它既然能通过非NULL检测,为什么又会挂掉呢?
在gcc下结果更加明显,因为它直接跳出该程序了。
不管是gcc下的情形和单片机下的情形有所不同,然而
在单片机调试模式下,我没有看到打出错误信息 target stop
这应该是 带操作系统和不带操作系统有所不同。
所以我想不通
非NULL的一个函数指针,怎么就死了呢?
这里的一个盲点也许是 如果给一个(结构体)指针赋值(地址),是否就不再为空指针呢?
这话一说完就知道是废话。
但是,如果不是如此,为什么?
哦,我懂了。
看代码方便说明 - uSCore_PosterStruct *uS_Poster;
- void uS_Initializer(void)
- {
- uSCore_Regist_Init(&uS_Register);
- uSCore_Poster_Init(uS_Poster);
-
- uS_Register.TimerInitial = Timer_Initial;
- uS_Register.Led_4_Test = uCGpio_Toggle;
-
- uS_Poster = uSInit(&uS_Register);
-
- // insert uSer to Apper
- get_uSTimerIsr();
- }
- uSCore_PosterStruct *get_uS_Poster(void)
- {
- return uS_Poster;
- }
复制代码我们注意到这个很重要的uS_Poster从头到尾只是一个指针。
这也不打紧,然而,它的地址所指向的却是uS中的一个结构体地址。
在uS的代码是这样的 - uSCore_PosterStruct uSerPost;
- uSCore_PosterStruct *uSInit(uSCore_RegistStruct *Str)
- {
- uSCore_Regist_Init(&uSerStr);
- uSCore_Poster_Init(&uSerPost);
-
- uSCore_RegistStruct_Copy(&uSerStr,Str);
-
- // Initial Timer;
- (*(Str->TimerInitial))();
- // insert TimerTask;
- uS_TaskList();
- uSerPost.TimerTask = uS_TaskList;
-
- return (&uSerPost);
- }
复制代码那么,这个地址是外部的.
外部又会如何呢?
仍然解释不通
为了简单起见,我仍然回到gcc下测试,没观察到相似的结果 - typedef struct
- {
- void (*Test)();
- }pTest;
- pTest *get_TestStruct(void);
- void Helloworld(void);
复制代码- #include "struct.h"
- #include
- static pTest TestStruct;
- pTest *get_TestStruct(void)
- {
- TestStruct.Test = Helloworld;
- return (&TestStruct);
- }
- void Helloworld(void)
- {
- printf("Helloworld.\n");
- }
复制代码- #include
- #include
- #include "struct.h"
- void main(void)
- {
- void (*pT)(void) = NULL;
- pTest *Str;
-
- Str = get_TestStruct();
-
- //Str = (malloc)(sizeof(pTest)*1);
-
- while(1)
- {
- if(Str->Test != NULL)
- pT = Str->Test;
- if(pT != NULL)
- (*pT)();
- }
- }
复制代码
[ 本帖最后由 辛昕 于 2013-8-4 14:43 编辑 ] |