【问题标题】:struct as unknown argument结构作为未知参数
【发布时间】:2011-11-17 08:34:40
【问题描述】:

我知道如何将未知数量的参数从未知类型传递给函数。 我的意思是这样的:

char* plugins_entry(const char* data, ...);

现在我试图将一个结构传递给该函数,除了一些其他参数。我在两个文件(main.c 和 plugins.c)中声明(或定义?)相同的结构。但是,当我尝试“过滤”从 main.c 传递的 irc 结构并从 plugins.c 解析 irc 结构中的数据时,我没有得到任何有用的东西。当我调用该函数时,出现分段错误。

这是 main.c 中的重要部分:

struct irc_data {
char nick[32];
char user[32];
char host[64];
char chan[32];
char message[512];
int is_ready;
};

....

int main(int argc, char** argv) {
    ....
    struct irc_data *irc = malloc(sizeof(struct irc_data));
    ....
    (*lib_plugin)("r",irc);  // call the function in plugins.c 
    ....
}

这里有洞plugins.c:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>

struct irc_data{
    char nick[32];
    char user[32];
    char host[64];
    char chan[32];
    char message[512];
    int is_ready;
};

char* plugins_entry(const char* data, ...) {
    int i;
    struct irc_data *irc = malloc(sizeof(struct irc_data));

    va_list args;
    va_start(args, data);

    for(i=0; data[i] != '\0'; ++i){
        if(data[i] == 'r'){
            irc = data[i];
        }
    }

    va_end(args);

    printf("\n\n------------------------\n");
    printf("What we got here: %s\n",irc->nick);
    printf("\n------------------------\n\n");


    return "done";
}

所以,我很确定我的指针做错了什么。

你能帮帮我吗?

谢谢

~泰克图

【问题讨论】:

  • 仅供参考,除了message(根据 RFC 需要 512),您不应该使用固定大小的缓冲区。其他一切都取决于使用的 ircd。虽然昵称不太可能超过 30 个字符,用户名/身份不太可能超过 10 个字符,但频道名称很可能超过 32 个字符。

标签: c struct arguments


【解决方案1】:

irc = data[i] 行没有任何意义。您需要拨打va_arg:

if(data[i] == 'r') {
    irc = va_arg(args, struct irc *);
}

另外,plugins_entry 中的malloc 没用,只会泄漏内存。

【讨论】:

  • 非常感谢,这行得通!是的,这对我来说更有意义:D
【解决方案2】:

您不会使用va_args() 提取指向结构的指针。这样,您应该可以直接使用您的结构:

struct irc_data *irc = va_args(args, struct irc *);

请注意,只要您不想显式复制,就不需要在此函数中使用 malloc。由于您的结构已经位于堆上(它在 main.c 中分配),您可以通过指针直接使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2023-04-09
    • 2011-04-15
    • 2014-04-26
    相关资源
    最近更新 更多