2016-06-04 6 views
0
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++; 

Это фрагмент кода, найденный в сокетах TCP/IP в C от Donahoo и Calvert, может ли кто-нибудь указать подробное объяснение кода? Я был бы очень благодарен, поскольку я должен объяснить этот фрагмент кода другим людям, и я не рядом с уровнем понимания, что я могу научить это кому-то.Объяснение для фрагмента в сокетах TCP/IP в C

+4

Если вы этого не понимаете, зачем его чему-то научить? –

+0

Вы также скопировали это неправильно. –

+0

Прошу прощения, если я скопировал это неправильно. Кажется, я не могу найти свою ошибку. Если вы можете указать, что это было бы здорово. Кроме того, я просто почувствовал, что, если я смогу научить кого-то, я лучше пойму это. – cRAYonhere

ответ

0

Ваш код просто копирует m.s в mp->s.

Ваш фрагмент кода объявляет struct typedeffed (с псевдонимом) до MSG. Затем он объявляет указатель на структуру *mp и объявляет конструкцию m инициализированной установкой m.a = 4; и пытается неправильно установить m.s[0] = 1; и m.s[1] = 0;. Указатели двух символов (a from-pointer) fp и (a to-pointer) tp. Затем пространство выделяется для 1 структуры, а адрес назначается mp.

Цикл for просто устанавливает из-указателяfp, чтобы указать на начало m.s[0] и к указателю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; 
} 

Пример использования/вывода

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

Посмотрите пояснения и сообщите мне, если у вас есть вопросы.

+0

Большое спасибо за то, что нашли время объяснить ничтожные гриты всего этого. Если вы будете достаточно любезны ответить на 2 моих запроса. 1. 'mp-> s' вы можете немного объяснить этот снимок. 2. «Контрольная статья гарантирует, что итерация останавливается после прохождения байтов в« мм ». И вы имеете в виду mp? – cRAYonhere

+0

Конечно, 1. При доступе к структуре через переменную struct вы используете оператор * dot * (например, 'ms'), но когда у вас есть указатель * на struct *, вы используете оператор * arrow * (например, 'mp-> s'). Это может сделать вашу голову больно, но 'm.s == (& m) -> s' и' mp-> s == (* mp) .s'. Подумайте обо всех случаях. Да, «мм» - это просто опечатка от моих пальцев и 10-летней клавиатуры ':)' –