我如何解释以下代码行

How Do I Interpret the Following Lines of Code

typedef struct {
int a;
short s[2];
} MSG;
MSG *mp, m = {4, 1, 0};
char *fp, *tp;
mp = (MSG *) malloc(sizeof(MSG));
for (fp = (char *)m.s, tp = (char *)mp->s; tp < (char *)(mp+1);)
*tp++ = *fp++;

所以我从我对 c 编程的记忆中推测出第一个块是使用 typedef 定义别名的结构声明。别名是味精? 下一个指针 *mp 和 struct m = {4, 1, 0} 被声明为 MSG 类型。 接下来创建两个字符指针,*fp 和 *tp。 mp 设置为等于 malloc(sizeof(MSG)),它被转换为类型 (MSG *) 或类型指针到 MSG?。 接下来设置 for 循环,其中 for fp = m.s(可以说是 struct m 中的 s)被强制转换为指向 char 的指针,tp = pointer mp 设置为 struct s;并且 tp < (char *)(mp + 1) 或指针加 1);)

我真的不确定,因为此时我对 c 的记忆很模糊。有人可以纠正我或更好地阐明这段代码在做什么吗?我试图辨别我是否准备好开始学习某本书,这是第一段代码。 接下来,无论指针 fp 指向什么,都会递增设置为 *tp,它也会递增。

正在将评论转化为答案。

  • 是; MSG 是别名。
  • 是的,mp是一个未初始化的指针,m是一个已初始化的MSG结构。
  • 是的,fptpchar * 个变量。
  • 强制转换在 C 中不是必需的,但在 C++ 中是必需的。
  • 代码然后写出 memcpy() — 或多或少。

可以这样写:

memmove(mp->s, m.s, sizeof(m.s));

(或者您可以使用 memcpy() — 不过我不使用它)。循环的 (char *)(mp + 1) 限制是分配结构之后结构的开始。

代码也可以写成:

mp->s[0] = m.s[0];
mp->s[1] = m.s[1];

这甚至可能更快。 事实上,它可以简单地写成:

*mp = m;

确实会初始化 mp->a 但无论如何都不应该长时间未初始化。如果不再使用 m 结构,则代码可以删除该变量并写入:

*mp = (MSG){ .a = 4, .s = { 1, 0 } };

使用 compound literal and designated initializers,两者都需要支持 C99 或更高版本。

有很多方法可以改进该代码段。这让人想知道这是否是一本值得学习的好书。对书中的不当之处保持怀疑的眼光可能是值得的。如果它是在 mid-oughts (200x) 或上个千年写成的,那么写的东西就有更好的借口,但是这么古老的书值得一​​读吗? (有一些那个时代的书仍然值得一读——见下面的评论。)