[devel] PyGTK

Alexey Tourbin at at altlinux.ru
Fri Jul 24 13:51:02 MSD 2009


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).
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.altlinux.org/pipermail/devel/attachments/20090724/57491fca/attachment.bin>


More information about the Devel mailing list