【问题标题】:What's this OLD C pointer-math / macro thing doing?这个 OLD C 指针数学/宏在做什么?
【发布时间】:2016-01-15 16:07:14
【问题描述】:

我需要帮助,试图了解一些旧的 C 代码中发生了什么。

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

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

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*/

当我想写入记录时,我像这样调用 DB 软件的 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 个字节)。

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

【问题讨论】:

  • sflong 是如何定义的?
  • @Codor... 在我的例子中,8 个字节。
  • 这可能只是一个无关紧要的错字,但int unused[46] 几乎可以肯定使用超过 46 个字节。你的意思可能是char

标签: c pointers macros b-tree isam


【解决方案1】:

您的分析是正确的。看起来好像他们在他们正在做的每个分配中都存储了一些隐藏的标头数据。所以他们只给你一个指向“用户”部分的指针。例如,只有当您必须free 数据时,您才需要知道分配空间的“真实”起点,这就是宏正在计算的内容。

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

【讨论】:

  • 那么,你认为我可以理解为:我可以对数据做任何我喜欢的事情,只要我把 lioWrite 交给它的 trueBase 值,我应该没问题。我查看了lioWrite,它本质上是一个股票 C write 调用......我假设隐藏的标题数据只是到 .nx 文件中相应索引的链接。
  • 您必须非常确定每个人都以相同的方式解释它,并且您确切知道write 的数据大小。但我猜想在调试器(或 valgrind)中运行东西会告诉您,您既不会丢失要写入的数据,也不会覆盖不应该写入的内存。逆向工程是一门很难的艺术:(
  • 您的见解很有帮助,谢谢!我还将添加以下内容...我的结构是 100 字节,但我注意到 bt3Write 中的数据大小显示为 108 字节。实际上,它在末尾添加了 8 个字节。我想知道这是否是为下一条记录的标题数据预留的空间。感谢您的猜测。
猜你喜欢
  • 2022-07-21
  • 2011-03-18
  • 2012-06-11
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多