c - C 语言 TCP/IP 套接字中片段的说明

标签 c unix code-snippets

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 的结构体(别名)。然后它声明一个指向 struct *mp 的指针,并声明 struct m 初始化设置 m.a = 4; 并尝试错误地设置 m.s[ 0] = 1;m.s[1] = 0;。两个字符指针(from-pointer)fp 和(to-pointer)tp。然后为 1 个结构分配空间,并将地址分配给 mp

for 循环只是将from-pointer fp 设置为指向 m.s[0] 的开头>,以及指向 mp->s[0]to-pointer tp。测试子句确保遍历 mp 中的字节(在 mp->s[0]mp 末尾之间)后停止迭代。 *tp++ = *fp++; 只需将 fp 指向的字节复制到 tp 指向的相应字节,并使用 post -increment 运算符将指针前进到每个字节中的下一个字节。 (有一种观点认为,赋值可以更好地写为 *tp = *fp++; ,并且在 for 语句中执行 tp 的增量由于解引用和增量的顺序不明确(缺乏保证),例如

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

示例使用/输出

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

查看说明,如果您有任何疑问,请告诉我。

关于c - C 语言 TCP/IP 套接字中片段的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37634363/

相关文章:

linux - Bash 脚本 cd 问题

emacs - 与 AUCTeX 一起使用时,在 $0 后以 % 结尾的 yasnippets 行为很奇怪

c - 错误: control may reach end of non-void function

unix - 如何使用 awk、sed 或其他 unix 命令每隔 n 个间隔获取一个行范围?

c - 位数组的使用方法

python - 使用脚本将文件从 UNIX 复制到 Windows

visual-studio-code - 插入方法/函数名称的 Visual Studio 代码片段?

javascript - 如何检测JavaScript是否被禁用?

c - 与 c 中的指针相关的问题

c - 通过尝试访问大于 C 中数组维度的位置来访问数组后面的变量