这个旧的 C 指针数学/宏在做什么?

What's this OLD C pointer-math / macro thing doing?

我需要帮助来理解一些旧 C 代码中发生的事情。

我正在使用一个旧的 btree/isam 软件产品(来自 Softfocus)将我的数据写入数据库。它本质上是将数据放入 mydb.dt 文件,将索引数据放入 mydb.nx(例如)。

在我的程序中,我有一个结构,其成员对应于数据库中的"fields"。结构是这样定义的(我用虚构的数据大大简化了):

typedef struct {
    unsigned char name[50];    /*size is 50 bytes*/
    int active;                /*size is 4 bytes*/
    int yet_unused_bytes[46];  /*unused space (in fixed-length record)*/
} DB_PEOPLE;                   /*total struct size is 100 bytes*/

当我想写入记录时,我会像这样调用数据库软件的 bt3Write 例程(people_db_fd 是我的数据库文件的描述符,而 db_current_record_people 只是一个副本我上面的结构,里面有数据):

ret = bt3Write(people_db_fd, db_current_record_people);

那个bt3Write例程基本上就是下面的(我认为确切地知道它在做什么并不重要,但关键部分是trueBase位)。 fd 是数据库文件,data 是字节流(我在上面交给它的 db_current_record_people 结构)。我想 recno 只是我在这里不关心的 nx 文件的一些开销,lioWrite 负责:

/*
 * all the keys are in; write the data record and store a copy
 */
if (lioWrite(fd -> fdData, recno, trueBase(data)) == UERROR)
    return (sfuint) isMuCallErr(BT3WRITE, 0);

在头文件中,trueBaseBASEOFFSET被定义为以下宏:

/*
 *  macro for easing the buffer address calculations (who knows what
 *  may change down the road
 */
#define  BASEOFFSET             (sizeof(sflong))
#define  trueBase(address)      ((char *) address - BASEOFFSET)

现在,这就是我需要帮助的地方(我绝不是 C 语言专家......几乎没有功能,真的)。我需要知道 trueBase 在做什么(或者你最好的猜测)。在我未经训练的眼睛看来,它似乎正在将指针移动到 BASEOFFSET 的长度(在我的系统上是 8 个字节)。

任何了解此特定软件产品的人也可以获得额外奖励积分!它很旧,我真的找不到任何文档。它的评论相当不错 - 除了这一点。

您的分析是正确的。看起来他们在每次分配时都存储了一些隐藏的 header 数据。所以他们只给你一个指向 "user" 部分的指针。仅当您必须 free 数据时,例如,您需要知道分配的 space 的 "real" 起点,这就是宏正在计算的内容。

我不申请加分,因为我不知道那是什么。