Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712

Инициализация структуры

27.03.2019, 20:30. Показов 1462. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех. Есть такой код:
C++
1
2
3
4
5
6
7
typedef struct
{
 char a[5];
 char b[5];
} ST;
 
ST b = { "abcde", "fghij" };
Компилятор C говорит "Все ОК!", компилятор С++ ругается: "initializer-string for array of chars is too long" и в принципе он прав. Почему тогда С не возмущается?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2019, 20:30
Ответы с готовыми решениями:

Инициализация структуры
Есть структура struct msg quest; struct msg { double clientId; size_t cash; char message; };

инициализация структуры
Всем привет, нужно достать данные о DEP и ASLR каждого процесса, написал такую вещь void GetDepAndASLR(DWORD ProcID) { HANDLE...

Инициализация членов структуры
Здравствуйте. Имеется код: #include <iostream> struct Pizza { char name; double diametr; double weidth; };

16
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
27.03.2019, 20:39
d7d1cd, предположу что это UB, и разные компилятор могут реагировать по разному, то есть C++ компилятор тоже может пропустить, но это не точно.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.03.2019, 20:57
d7d1cd, строка “abcde” это 6 символов, вам же компилятор явно на это ткнул носом.

Добавлено через 2 минуты
_stanislav, где UB?
0
3 / 2 / 3
Регистрация: 09.05.2014
Сообщений: 64
27.03.2019, 21:07
d7d1cd, Как и сказал Azazel-San в ваших строках 6 символов, а в массивах место под 5. Последний символ в строке с++ всегда символ завершения строки '\0', поэтому массивы нужно делать на 1 символ больше чем в них будет храниться (на счет си не знаю, не работал с ним)
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
27.03.2019, 21:22  [ТС]
Я знаю, что строки кончаются на \0, поэтому компилятор С++ и ругается. Но в С строки тоже кончаются на \0, однако компилятор С пропускает такой код. В отладчике видно, что там в строках нет нуль-терминального символа. Почему компилятор С не выдает ошибку? Не умеет что ли? В С++ только научили?
0
Неэпический
 Аватар для Croessmah
18149 / 10733 / 2067
Регистрация: 27.09.2012
Сообщений: 27,031
Записей в блоге: 1
27.03.2019, 22:00
Цитата Сообщение от d7d1cd Посмотреть сообщение
Почему тогда С не возмущается?
Потому что C и C++ - разные языки.
В C - это нормально, в C++ - запрещено.

Цитата Сообщение от d7d1cd Посмотреть сообщение
Не умеет что ли?
Он так и должен работать, для языка C это не ошибка.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.03.2019, 22:10
Цитата Сообщение от d7d1cd Посмотреть сообщение
Почему компилятор С не выдает ошибку? Не умеет что ли?
Похоже строка просто урезается, но не понятно по каким правилам.
Я думаю вам стоит обратится в раздел по Си или покурить стандарт и стековерфлов.
0
Неэпический
 Аватар для Croessmah
18149 / 10733 / 2067
Регистрация: 27.09.2012
Сообщений: 27,031
Записей в блоге: 1
27.03.2019, 22:11
Цитата Сообщение от Azazel-San Посмотреть сообщение
но не понятно по каким правилам.
An array of character type may be initialized by a character string literal or UTF−8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array
Другими словами, что залезло, то залезло.
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.03.2019, 22:13
Цитата Сообщение от Croessmah Посмотреть сообщение
Другими словами, что залезло, то залезло.
Уфф, удобно то как
Зачем париться, ерроры еще какие-то выдавать, пфф.
Хотя если помнить это правило, то и ничего страшного в этом нету.
0
Неэпический
 Аватар для Croessmah
18149 / 10733 / 2067
Регистрация: 27.09.2012
Сообщений: 27,031
Записей в блоге: 1
27.03.2019, 22:15
Azazel-San, дело не в эррорах, а в том,
что программисту лучше известно что и как должно быть.
Это же C. Он приучен доверять программисту.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.03.2019, 22:17
Цитата Сообщение от Croessmah Посмотреть сообщение
Это же C. Он приучен доверять программисту.
Главное что бы этот программист доверял себе
0
Неэпический
 Аватар для Croessmah
18149 / 10733 / 2067
Регистрация: 27.09.2012
Сообщений: 27,031
Записей в блоге: 1
27.03.2019, 22:18
В C++ тоже так можно, но придется писать так:
C++
1
char arr[5] = {'a', 'b', 'c', 'd', 'e'};//неудобно же :)
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.03.2019, 22:22
Цитата Сообщение от Croessmah Посмотреть сообщение
//неудобно же
Это ж сколько шкрябать надо?)
Ну и похоже не совсем так
C
1
char a[5] = "asdfghj"; // OK
C++
1
char a[5]{'a', 's', 'd', 'f', 'g', 'h'}; // уже h не опрокинуть
0
Неэпический
 Аватар для Croessmah
18149 / 10733 / 2067
Регистрация: 27.09.2012
Сообщений: 27,031
Записей в блоге: 1
27.03.2019, 22:30
Цитата Сообщение от Azazel-San Посмотреть сообщение
уже h не опрокинуть
В C тоже так:
C
1
char a[5] = {'a', 's', 'd', 'f', 'g', 'h'}; // уже h не опрокинуть
Массив-то на 5 элементов, а ты хочешь запихнуть шестой.
А вот при инициализации строковыми литералами C++ требует,
чтобы в массиве уместились все символы, а C инициализирует только то, что помещается.
Вот в C просто запихивается пять элементов и всё, шестой отсекается.
Кажется, многие забывают, что массивы char - это не только строки,
с завершающим нулем, а еще и буфера для всякого разного добра.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.03.2019, 23:01
Цитата Сообщение от Croessmah Посмотреть сообщение
В C тоже так:
Я к тому что в Си приемлемо, то в С++ не приемлемо.
...
Цитата Сообщение от Croessmah Посмотреть сообщение
шестой отсекается
Но только при
Цитата Сообщение от Croessmah Посмотреть сообщение
инициализации строковыми литералами
А это
Цитата Сообщение от Croessmah Посмотреть сообщение
{'a', 's', 'd', 'f', 'g', 'h'}; // уже h не опрокинуть
уже немного другое.
Как в Си, так и в С++ и не надо пытатся эмулировать одно на другом
0
Неэпический
 Аватар для Croessmah
18149 / 10733 / 2067
Регистрация: 27.09.2012
Сообщений: 27,031
Записей в блоге: 1
27.03.2019, 23:05
Цитата Сообщение от Azazel-San Посмотреть сообщение
Я к тому что в Си приемлемо, то в С++ не приемлемо.
Я ж написал
Цитата Сообщение от Croessmah Посмотреть сообщение
В C - это нормально, в C++ - запрещено.

Цитата Сообщение от Azazel-San Посмотреть сообщение
уже немного другое.
Но в C++ только так можно инициализировать при определении массивы символами без завершающего нуля - по одному.
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.03.2019, 23:06
Цитата Сообщение от Croessmah Посмотреть сообщение
Но в C++ только так можно инициализировать при определении массивы символами без завершающего нуля.
Вооот. Это я и пытался сказать. Но похоже недосып дается в знаки..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.03.2019, 23:06
Помогаю со студенческими работами здесь

Структуры, инициализация переменных
Возможно ли как-либо реализовать такой концепт: Если что-то там, то структура содержит N переменных, если НЕ что-то там, то содержит M? ...

Инициализация POD-структуры C++11
1. Можно ли так проинициализировать массив, чтоб не создавать конструктор ? struct A { int a = 0; void* ptr =...

Инициализация структуры через точку
Доброго юзаю MVS2012 Проблема есть структура struct ST { int a; int b; };

Инициализация всех полей структуры
Всем привет. struct sFoo { int a; char b; struct {

Инициализация полей структуры из файла
Помогите, пожалуйста, разобраться с файлами. Имеется такая структура: enum Pos {director = 1, manager, bookkeeper, secretary,...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru