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