gpt4 book ai didi

c - 检索函数中的指针

转载 作者:行者123 更新时间:2023-11-30 19:08:02 25 4
gpt4 key购买 nike

我想要在函数中接收填充数据(包括指针)的结构,我将要填充的结构的指针传递给该函数。现在我意识到退出函数时我会丢失指针,因此我相信我可能需要使用双指针。那是对的吗?我想出了一个示例程序,该程序可以编译,但由于在 main() 中访问无效指针而遇到了段错误(第 43 行),请参见下文:

#include <stdio.h>

#define NUM 100

typedef enum state_e {
SM_ANALYZE = 0,
SM_TX,
SM_PEND,
} state_t;

typedef struct data_s {
int flags;
int id;
int local_min_tx;
int local_min_rx;
int local_detect_mult;
int egr_obj;
int label;
int egress_label;
int port;
state_t state;
}data_t;

typedef struct content_s{
state_t state;
data_t *pData;
void (*cbck)(data_t*,state_t);
}content_t;

static content_t MyCont[NUM]={0};
static data_t MyDat[NUM]={0};

void callback(data_t *pDat,state_t state);

int main(void)
{
content_t locC = {0};
callback_reg(1,callback);
data_set(1,&MyCont[1],SM_PEND);
data_get(1,&locC);


printf("cbck %p\ndata %p\nstate %d\nlabel %d",locC.cbck,
locC.pData,
locC.state,
locC.pData->label);

MyCont[1].cbck(&MyDat[1],MyDat[1].state);
}

void callback(data_t *pDat,state_t state)
{
printf("in user callback!\n");
printf("BFDId %d is now %d\n",pDat->id,state);
return;
}
int data_set(int id, content_t *pDat, state_t state)
{
pDat->pData = &MyDat[id];
pDat->state = state;
}

int callback_reg(int id, void (*cb)(data_t*,state_t))
{
MyCont[id].cbck=cb;
}
int data_get(int id, content_t *pDat)
{
pDat = &MyCont[id];
}
//--------------------------------------------------------------------------

最佳答案

这里

int data_get(int id, content_t *pDat)
{
pDat = &MyCont[id];
}

本地变量pDat被赋值,然后函数被保留,并且pDat被释放为本地变量。

你想要的是:

#include <errno.h> /* for errno */

/*
* Gets content_t from MyConf at index id.
*
* Returns 0 on success or -1 on error.
*/
int data_get(size_t id, content_t *pDat)
{
int result = 0;

if (NULL == pDat)
{
errno = EINVAL;
result = -1;
}
else if (NUM <= id)
{
errno = ERANGE;
result = -1;
}
else
{
*pDat = MyCont[id]; /* Copy MyCont[id] to where pDat points. */
}

return result;
}

并这样调用它:

#include <stdlib.h> /* for EXIT_FAILURE */
#include <stdio.h> /* for perror() */

int data_get(int, content_t *);

int main(void)
{
..
if (-1 == data_get(1,&locC))
{
perror("data_get(1, ...) failed");
exit(EXIT_FAILUE);:
}

关于c - 检索函数中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46136043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com