c - 在结构中没有得到正确的值

标签 c

这可能是个愚蠢的问题,但我的代码中没有发现错误。

我正在编写简单的命令解析器,它将在其中初始化适当的参数并调用与命令代码相关的适当函数。

例如

char buffer[]="1123,13,46";

在上一行 1123是命令代码,其余两个标记是参数。在解析器中,它将首先从命令表中找到命令代码,如果找到命令,它将使用上述参数初始化该命令的结构。

目前在我的代码中,我成功地从命令表中获取正确的命令并调用该命令的函数,但未能使用上述值(此处为 13 和 46)初始化参数。总是得到 0 .

按照下面的代码,我想要在我的命令解析器中做同样的事情,但修改很少

typedef struct
{
    void *fields[2];

}tmpStruct;

typedef struct
{

    int x;
    int y;

}myStruct;

tmpStruct tmp_struct;

myStruct *getParams(tmpStruct *t_struct)
{
    myStruct *genericStruct = malloc(sizeof(myStruct));

        //setup the order of the fields in the handler
    t_struct->fields[0]=(void*)&genericStruct->x;

    t_struct->fields[1]=(void*)&genericStruct->y;

    return genericStruct;
}

void *fillValue(tmpStruct *t_struct)
{
    void *genericStruct;

    genericStruct = getParams(t_struct);

    *((int*)t_struct->fields[0])=12;
    *((int*)t_struct->fields[1])=13;

    return genericStruct;
}

void pritValue(myStruct *my_struct)
{
    printf("%d  %d\n",my_struct->x,my_struct->y);
}

int main()
{
    void *genericStruct;

    genericStruct = fillValue(&tmp_struct);

    pritValue(genericStruct);

    return 0;
}

请找到我的工作源文件here

和头文件here

最佳答案

问题在于您将函数指针转换为采用不同参数类型的函数类型。试图通过这样的指针调用函数是未定义的行为。尽管您可能会逃脱类似的调用 - 例如,返回 myStruct*代替 void*指针(虽然它仍然是未定义的行为),你无法转换一个接受 int 的函数。和一个 myStruct*到采用 int 的函数类型和参数的可变列表。

将您的函数更改为正确的签名以匹配 cmdTableStruct表修复了这个问题:

void *setParams(paramHandler_type *pHandler);
int printParams(int commandType,... );

static cmdTableStruct cmdTable[]=
{
 { 1123,setParams,printParams },
 //more command in same manner
};

Demo.

当然,现在您需要处理来自 ... 的参数使用 <stdarg.h> 中的功能单独列出标题。

此外,您在分配值时取消引用参数处理程序的方式不正确 - 索引应应用于 paramValue ,而不是pHandler :

*((int*)pHandler->paramValue[j]) = (int)atoi(token);

关于c - 在结构中没有得到正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27981807/

相关文章:

c - 无效读取大小 4 错误 C 编程

c++ - Windows运行时库依赖和纯C代码

c - 该程序中将二进制数转换为十进制数的 for 循环背后的逻辑是什么

c - 使用 malloc 初始化指向结构体的指针

c - 选择语句和针对 NULL 的检查

c - 为什么我们要将单元测试文件与源文件分开?

c++ - 为什么没有更多地使用clang?

c++ - 在发送有关帖子的一些信息之前,如何让 libcurl 进行回调?

c - 提高这段代码可读性的建议

c - 数据类型截断