Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
1

Как правильнее инициализировать структуры?

14.12.2015, 20:28. Показов 5198. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Разбираюсь со структурами в C по книге "Язык С в 21 веке, Бен Клеменс"

Интерисует вопрос, как правильнее инициализировать структуры

Написал следующий код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
 
typedef struct {
  char *name;
  int left, right, up, down;
} direction_s;
 
int main () {
  direction_s D1; // без инициализации
  printf("left: %d\n", D1.left);
 
  direction_s D2;  // инициализация нулями с помощью memset
  memset(&D2, 0, sizeof D2);
  printf("left: %d\n", D2.left);
 
  direction_s D3 = {}; //  инициализация с помощью пустого инициализатора
  printf("left: %d\n", D3.left);
 
  direction_s D4 = {.right=1}; // инициализация поля right значением 1, остальные переменные иницилазируются нулями
  printf("left: %d, right: %d, name: %s\n", D4.left, D4.right, D4.name);
}
Вывод:
Bash
1
2
3
4
left: 4195821
left: 0
left: 0
left: 0, right: 1, name: (null)
В первом случае, соответственно, структура не инициализирована, в результате в поле left вывелся мусор?
в остальных случаях реализованы разные варианты инициализации - с помощью memset, с помощью пустого инициализатора, и с помощью инициализации какого-то поля, при этом остальные поля инициализируются нулями

Вопрос - как вы инициализируете структуры в своих программах и как правильно.
Насколько я понял, позиционные инициализаторы появились в стандарте C99 и не поддерживаются C++ компиляторами.
Например, у меня не получилось скомпилировать с помощью g++ данный пример:

Bash
1
2
3
4
5
g++ c_initializers.c -o c_initializers -g -Wall -std=gnu11 -O3
cc1plus: предупреждение: command line option «-std=gnu11» is valid for C/ObjC but not for C++ [по умолчанию включена]
c_initializers.c: В функции «int main()»:
c_initializers.c:20:29: пока не реализовано: non-trivial designated initializers not supported
   direction_s D4 = {.right=1}; // инициализация поля right значением 1, остальные переменные иницилазируются нулями
Посмотрел исходники tmux, и не до конца понятно -
в одном случае используются позиционные инициализаторы

а во втором - инициализация нулями с помощью memset

хотя во втором случае можно было бы инициализировать структуру следующим образом:
C
1
2
3
struct sockaddr_un sa = {
  .sun_family = AF_UNIX
};
без memset-а
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2015, 20:28
Ответы с готовыми решениями:

Как правильнее использовать main ()
#include &quot;stdafx.h&quot; #include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;time.h&gt; #include...

Как правильнее расширить стэк при добавлении элементов N длины
Подскажите пожалуйста как правильнее расширить стэк при добавлении элементов N длины то есть их...

Как лучше инициализировать массив?
Как лучше инициализировать массив? unsigned int *servo_position; void servo_on(void) {...

Как инициализировать локальную переменную?
Работаю над заданием. Нужно создать структуру &quot;Страна&quot;. Делаю все вроде правильно. Но есть одна...

0
14.12.2015, 20:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2015, 20:28
Помогаю со студенческими работами здесь

Как инициализировать массив указателей на функцию?
Здравствуйте! выдаёт ошибку при компиляции что не так с инициализацией? это массив на указатели. ...

Как правильно инициализировать несколько строк в 1 массиве?
у меня есть след код: char allowedFlags = {&quot;size&quot;, &quot;port&quot;, &quot;soft&quot;}; у меня компилятор выдает...

Как инициализировать массив с переменным числом элементов?
scanf(&quot;%i&quot;,&amp;b); int N={0};

Как инициализировать динамический массив в отдельной функции?
Здравствуйте, хочу инициализировать три динамических массива отдельной функцией. int main(int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru