将值传递给 C 中的函数

Posted

技术标签:

【中文标题】将值传递给 C 中的函数【英文标题】:Passing values to a function in C 【发布时间】:2011-08-17 17:27:15 【问题描述】:

我是 C 的新手,两个月以来一直在研究它。我有一个如下所示的结构:

struct profile_t

    unsigned char length;
    unsigned char type;
    unsigned char *data;
;

typedef struct profile_datagram_t

    unsigned char *src;
    unsigned char *dst;
    unsigned char ver;
    unsigned char n;
    struct profile_t profiles[MAXPROFILES];
 header;

header outObj;

现在结构元素内的值被读取为outObj.src[i]outObj.dst[i]outObj.profiles[i].type

现在我想调用一个函数并将我读取的值传递给一个实际上是 Berkeley DB 的函数。

void main()

    struct pearson_record 
        unsigned char src[6];
        unsigned char dst[6];
        unsigned char type;
    ;

    DB *dbp;
    int ret;

    if ((ret = db_create(&dbp, dbenv, 0)) !=0)
        handle_error(ret);

    if ((ret = dbp->open(dbp, NULL, "pearson.db", NULL, DB_BTREE, DB_CREATE, 0600)) !=0)
        handle_error(ret);

    const DBT *pkey;
    const DBT *pdata;

    struct pearson_record p;
    DBT data, key;

    memset(&key, 0, sizeof(DBT));
    memset(&data, 0, sizeof(DBT));

    memset(&s, 0, sizeof(struct pearson_record));

现在上面的代码是通过查看 DB 参考指南中的示例编写的。但我不明白const DBT 是什么。他们还使用memcopy 在结构内部添加了值,我知道这是正确的方法,但现在我想memcopy 传递上面提到的值并将它们存储在结构pearson_record 中。我该怎么办?任何形式的帮助将不胜感激。

【问题讨论】:

【参考方案1】:

请发布完整的代码。您提到“他们 memcopy”(我假设您指的是 memcpy),但我看到的只是一堆 memset(*,0)。希望你不会混淆他们。

此外,“他们使用 memcopy 在结构内部添加了我知道的正确方法”也不完全正确。不一定是错的,但是... char* 基本上被解释为 C 字符串。这是一个字节数组,表示必须以 null 结尾的字符(即最后一个字符必须为 0,相当于 '\0')。复制字符串的正确方法是使用 strcpy()(或 windows 上的 strcpy_s),不同之处在于 memcpy 更快并且用于其他情况(例如指针\缓冲区管理)。

unsigned char* 并没有被如此使用(至少我直到现在才看到它)。作为关于 char、unsigned char、signed char、char[] 和 char* 的说明(并不是说它会以任何方式更改您的代码,只是为了确保您了解其中的差异)。

至于复制数据,我假设您的意思是从 pearson_record 到标题的 src、dst 和类型,对吗?如果是这样,为了简单起见,我想建议 memcpy,但您说每个元素都作为 [i] 访问。这是否意味着 header.src 是一个包含多个 pearson_record.src 的数组,还是 header.src[i] 对应于 pearson_record.src[i] ?这对我来说有点不清楚。

char* src 和 char* *src 是有区别的。

【讨论】:

以上是关于将值传递给 C 中的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将值传递给 CloudWatch 中的 Lambda 函数?

将值直接作为数组传递给C [重复]

通过R中的变量将值传递给函数

将值传递给多个函数

将值传递给 LWC 中的闪电输入标签

将值传递给文本文件时停止附加