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/