我有以下结构定义:
typedef struct S_t S_t;
struct S_t {
float *s_ptr;
uint32_t ns;
};
typedef struct p_t p_t;
struct p_t {
int32_t pID;
float pVal;
};
typedef struct pr_t pr_t;
struct pr_t {
S_t *S;
int (*TrimS)(S_t *TS, int sSize);
p_t *TP;
};
我还定义了以下函数:
int success = 0;
int failure = -1;
int ChopS(S_t *TS, int size)
{
int i, c;
for(i = 0; i < TS->ns; i++)
{
if (i >= size)
TS->s_ptr[i] = 0.0;
}
c = 0;
for(i = 0; i < TS->ns; i++)
{
if(TS->s_ptr[i] == 0.0)
c++;
}
if (c == size)
return success;
else
return failure;
}
我做了以下(完整代码在这里)分配值给类型pr_t
的每个成员,其中一个成员是TrimS
,这是一个状态标志函数指针:
p_t *p2 = NULL;
S_t *tS2 = NULL;
tS2 = malloc(sizeof(S_t));
pr_t *SP2 = NULL;
SP2 = malloc(sizeof(pr_t));
p2 = (p_t *) malloc(sizeof(p_t));
SP2->S = tS2;
SP2->TP = p2;
SP2->TrimS = ChopS;
SP2->TrimS(tS2, 8);
如果我尝试使用SP2->TrimS
访问标志的值,我会得到一个垃圾值(或我认为的地址值),但不是我期望的0
或-1
。这里到底发生了什么?如何访问SP2->TrimS
中ChopS
设置的值
您需要调用该函数来获取返回值。它不存储在任何地方,函数指针也不存储最后一个返回值。使用它作为任何"正常"函数
if(SP2->TrimS(tS2, 8) == failure)
{
/* do something */
}
else
{
/* do something else */
}
或者如果您想稍后(在调用之后)访问它,则需要将其存储在变量中或有一个额外的结构成员来存储它:
struct pr_t {
S_t *S;
int (*TrimS)(S_t *, int);
int last_TrimS_Return_Value;
p_t *TP;
};
/* .... */
SP2 -> last_TrimS_Return_Value = SP2->TrimS(tS2, 8);