URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6658
[ Назад ]

Исходное сообщение
"Инициализация структуры"

Отправлено Answer , 05-Авг-07 22:46 
Всем!
Сталкнулся с задачей:
Есть произвольная большая структура:
struct st_t {
  char *s;
  int **i;
  some_t *b;
  ...
};
Необходимо заполнить ее нулями. Подойдет ли для этой задачи memcpy?

Содержание

Сообщения в этом обсуждении
"Инициализация структуры"
Отправлено phpcoder , 05-Авг-07 22:49 
[...]
>Необходимо заполнить ее нулями. Подойдет ли для этой задачи memcpy?

Вы хотели сказать memset()? Думаю, да.


"Инициализация структуры"
Отправлено Answer , 06-Авг-07 01:57 
>[...]
>>Необходимо заполнить ее нулями. Подойдет ли для этой задачи memcpy?
>
>Вы хотели сказать memset()? Думаю, да.

В данном случае, если *a, то a=NULL будет идентично a=0?


"Инициализация структуры"
Отправлено jd , 06-Авг-07 04:22 
>В данном случае, если *a, то a=NULL будет идентично a=0?

"если *a" - имелось в виду "если a - указатель"?

Строго говоря, NULL не обязательно должен быть равен 0, но я не слышал про реально существующие платформы, где он не равен.


"Инициализация структуры"
Отправлено Iceman , 06-Авг-07 11:20 
>Всем!
>Сталкнулся с задачей:
>Есть произвольная большая структура:
>struct st_t {
>  char *s;
>  int **i;
>  some_t *b;
>  ...
>};
>Необходимо заполнить ее нулями. Подойдет ли для этой задачи memcpy?

Есть еще такой удобный способ: struct st_t aaa = {0};
При этом каждый элемент заполнится нулевыми значениями, которые соответствуют типам полей структуры: инты  - 0, double - 0.0, указатели - NULL и т.д. Также подходит и для инициализации массивов.


"Инициализация структуры"
Отправлено perece , 07-Авг-07 16:24 
>Есть еще такой удобный способ: struct st_t aaa = {0};
>При этом каждый элемент заполнится нулевыми значениями, которые соответствуют типам полей структуры:
>инты  - 0, double - 0.0, указатели - NULL и
>т.д. Также подходит и для инициализации массивов.

C++ специфик. вы не допускаете, что кто-то пишет без плюсов? если нет, то хотяб оговориться надо...

\^P^/


"Инициализация структуры"
Отправлено Iceman , 08-Авг-07 15:29 
>>Есть еще такой удобный способ: struct st_t aaa = {0};
>>При этом каждый элемент заполнится нулевыми значениями, которые соответствуют типам полей структуры:
>>инты  - 0, double - 0.0, указатели - NULL и
>>т.д. Также подходит и для инициализации массивов.
>
>C++ специфик. вы не допускаете, что кто-то пишет без плюсов? если нет,
>то хотяб оговориться надо...
>
>\^P^/

С++ специфик я не знаю, потому как пишу пока только на чистом C. Но в умных книжках по С не просто советуют, а настоятельно рекомендуют использовать именно такой способ инициализации структур, поскольку только он гарантирует правильное представление нуля (при инициализации всей струтуры) для double (float) и указателей (NULL).

Кроме того, программа компилировалась так:
andrey@linux: gcc -x c test.c -ansi -std=c89

без единого замечания.

PS. Может быть я и не прав, тогда поправьте меня.


"Инициализация структуры"
Отправлено perece , 09-Авг-07 20:43 
>Кроме того, программа компилировалась так:
>andrey@linux: gcc -x c test.c -ansi -std=c89
>
>без единого замечания.

{долго чешет репу} ну не знаю. надо стандарты перечитать. я уж скока времени думал, что это плюсы. везде использовал memset (и у других видел его же).

\^P^/


"Инициализация структуры"
Отправлено Iceman , 10-Авг-07 11:14 
>{долго чешет репу} ну не знаю. надо стандарты перечитать. я уж скока
>времени думал, что это плюсы. везде использовал memset (и у других
>видел его же).

Я тоже всегда пользовал memset и был счастлив, пока не узнал про '{}'.
Стандарт c99, раздел 6.7.8 - если я правильно понял, это что-то из новенького...


"Инициализация структуры"
Отправлено Икста , 10-Авг-07 11:26 
>Всем!
>Сталкнулся с задачей:
>Есть произвольная большая структура:
>struct st_t {
>  char *s;
>  int **i;
>  some_t *b;
>  ...
>};
>Необходимо заполнить ее нулями. Подойдет ли для этой задачи memcpy?

Да попробуйте и всё.