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
看看解释,有什么问题可以告诉我。
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
看看解释,有什么问题可以告诉我。