TCP/IP sockets in C 中的片段说明

Explanation for snippet in TCP/IP sockets in C

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++;

这是在 Donahoo 和 Calvert 的 TCP/IP Sockets in C 中找到的代码片段 任何人都可以提供代码的详细解释吗?我真的很感激,因为我必须向其他人解释这个代码片段,而我还没有达到可以教别人的理解水平。

您的代码只是将 m.s 复制到 mp->s

您的代码片段声明了一个类型定义(别名)为 MSG 的结构。然后它声明一个指向结构 *mp 的指针并声明结构 m 初始化设置 m.a = 4; 并尝试错误地设置 m.s[0] = 1;m.s[1] = 0;。两个字符指针 (a from-pointer) fp 和 (a to-pointer) tp。 Space 然后分配给 1 个结构,地址分配给 mp.

for 循环只是将 起始指针 fp 设置为指向 m.s[0] 的开头,而 to-pointer tp 指向 mp->s[0]。测试子句确保迭代在 mp 中的字节(在 mp->s[0]mp 结束之间)被遍历后停止。 *tp++ = *fp++; 简单地将 fp 指向的字节复制到 tp 指向的相应字节并使用 post-increment 运算符将指针前进到每个中的下一个字节。 (有一种说法认为,赋值可以更好地写成 *tp = *fp++;并且由于取消引用顺序中的歧义(缺乏保证),tp 的增量在 for 语句中执行和递增),例如

for (fp=(char*)m.s, tp=(char *)mp->s; tp <(char *)(mp+1); tp++)
    *tp = *fp++;

也就是说,您问题中的代码的更正和注释版本可以编写如下:

typedef struct{
    int a;
    short s[2];
} MSG;

MSG *mp, m = {4, {1, 0}};
char *fp, *tp;
mp = malloc (sizeof *mp);
for(fp=(char*)m.s, tp=(char *)mp->s; tp <(char *)(mp+1);)
    *tp++ = *fp++;

一个简短的例子(用 8 代替 0 来说明发生了什么)可以是:

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

typedef struct{
    int a;
    short s[2];
} MSG;

int main (void) {

    MSG *mp, m = {4, {1, 8}};
    char *fp, *tp;

    mp = malloc (sizeof *mp);   /* allocate mem for one struct */
    for (fp = (char*)m.s,       /* fp points to first byte of 2 in m.s   */
        tp = (char*)mp->s;      /* tp points to first byte of 2 in mp->s */
        tp < (char*)(mp+1);)    /* test tp within mp (mp->s actually )   */
        *tp++ = *fp++;          /* copy m.s to mp->s */

    printf ("m.a   %d, m.s[0]   %hd, m.s[1]   %hd\n", m.a, m.s[0], m.s[1]);
    printf ("mp->a %d, mp->s[0] %hd, mp->s[1] %hd\n", mp->a, mp->s[0], mp->s[1]);

    return 0;
}

例子Use/Output

$ ./bin/snip
m.a   4, m.s[0]   1, m.s[1]   8
mp->a 0, mp->s[0] 1, mp->s[1] 8

看看解释,有什么问题可以告诉我。