On Fri, Jul 24, 2009 at 01:44:49PM +0400, Alexey Rusakov wrote: > В Птн, 24/07/2009 в 10:59 +0400, Alexey Tourbin пишет: > > On Fri, Jul 24, 2009 at 02:53:35PM +0800, REAL wrote: > > > Исходный код: > > > strncpy((char *) &event->client.data, tmp, > > > > А зачем тут адрес берётся? > Адрес тут берётся, потому что event->client.data - это union. > event->client - это GdkEventClient, который выглядит так: > > typedef struct { > GdkEventType type; > GdkWindow *window; > gint8 send_event; > GdkAtom message_type; > gushort data_format; > union { > char b[20]; > short s[10]; > long l[5]; > } data; > } GdkEventClient; В том-то и дело, что если копируем в массив, то адрес массива брать не нужно (или не обязательно). Поэтому сразу подозрение, что копируют куда-то не туда, куда хотят. > Соответственно, люди таким образом копируют строку в > event->client.data.b . Не знаю, почему бы не использовать явное указание > поля в объединении - может, с переносимостью этого какая проблема... Но > у меня есть подозрение, что на 64-разрядной платформе размер этого > union'а оказался больше, чем размер его поля. Проверить, к сожалению, в > данный момент не на чем (а на 32 битах всё в порядке, sizeof data > возвращает 20).