|
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
|
||||||
В чем разница между динамическим массивом и статическим?07.01.2019, 11:59. Показов 58126. Ответов 220
Метки нет (Все метки)
ребята, я не понимаю различия. вроде читал литературу.
ну вот говорят, что динамический массив, это массив выделение памяти под который будет происходит в процессе выполнения программы. и тут я залез в онлайн компилятор (с++ 14) и сделал так
0
|
||||||
| 07.01.2019, 11:59 | |
|
Ответы с готовыми решениями:
220
Разница между статическим и динамическим полиморфизмом В чем разница между вектором и массивом В чем разница между обычным массивом и контейнером |
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 09.01.2019, 22:45 | |||
|
Опять же. Речь о С++ а не про платформы
0
|
|||
|
Неэпический
|
|||||||
| 09.01.2019, 22:47 | |||||||
std::string::operator[]
0
|
|||||||
| 09.01.2019, 22:51 | |
|
2
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 09.01.2019, 22:59 | |
|
HelicopterK52,
Если что то документировано то это другое дело. Я же говорю про то что не документировано и с точки зрения с++ а не конкретных платформ
0
|
|
| 09.01.2019, 23:07 | ||
|
Банальный пример - запись по не выровненному адресу. На каких-то платформах это будет нормально работать, а на каких-то вывалится здоровенная аппаратная ошибка. Как стандарт c++ должен подобное документировать? Только как undefined (или unspecified) behavior.
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 09.01.2019, 23:09 | ||
|
0
|
||
| 09.01.2019, 23:16 | ||
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 09.01.2019, 23:20 | |
|
HelicopterK52,
Согласен, этим никто не спорит... Платформозависимые фичи часто используется Я против документированного поведения ничего не имею Конкретно в данном случае речь о том что, "я думаю что будет работать так", а гарантий нет. Тут даже конкретная платформа не обсуждалась Тоже понимаю что работать скорее всего будет и даже писал об этом но гарантий нет Речь об этом...
0
|
|
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|||||||
| 09.01.2019, 23:24 | |||||||
|
Теперь подробнее. Есть объект a типа int[3][3]. Что является значением указателя pa, инициализированного как int * pa =reinterpret_cast<int*>(a);?Ну, во-первых, a попадает под array-to-pointer conversion, т.к. reinterpret_cast между указателями требует prvalue аргумент, а
reinterpret_cast<int*>(a) преобразует указатель с типом int(*)[3], со значением "указатель на нулевой элемент массива a —a[0]".reinterpret_cast<int*>(a) определён как static_cast<int*>(static_cast<void*>(a)) https://timsong-cpp.github.io/... ret.cast#7Каст к void* не меняет значения указателя
Про static_cast<int*>(...):
b типа T == int, конечно, есть по адресу A, который представляет указатель static_cast<void*>(a). Но объект a[0] типа int[3] не является pointer-interconvertible со своим первым элементом типа int (см. https://timsong-cpp.github.io/... onvertible)Значит, static_cast<int*>(...) не меняет значения указателя и он по-прежнему указывает на a[0].Итак, имеем переменную int * pa =reinterpret_cast<int*>(a); с типом int* и значением указатель на a[0].Теперь к арифметике указателей.
pa значения от 0 до 3. pa указывает на a[0], следовательно, pa + 2 указывает на a[2]. Естественно, напрягает тот факт, что указатель с типом int* указывает на объект с типом int[3]. Про это написано чуть ниже
int и int[3] are not similar.Вот и UB. То, что тут массив двумерен, а там был трёхмерен — не играет существенной роли.
2
|
|||||||
| 09.01.2019, 23:40 | ||
|
Важно понять, что язык, как и его библиотека - это лишь причиндалы, это они подгоняются под платформы, а не наоборот.
0
|
||
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
| 09.01.2019, 23:50 | |
|
В качестве упражнения можете попробовать найти UB при попытке что-то прочитать через
pa (типа int j = *pa;). (Наверное это слишком просто для упражнения).
0
|
|
|
Комп_Оратор)
|
|||
| 10.01.2019, 00:06 | |||
|
Указатель на определённый байт, является переменной хранящей его адрес. Тип значения по указателю не тип одномерного массива int[3] а это тип int и это значит, что индекс исходного массива равно как и подмассивов тут вообще не причём. Просто указатель указывает на первый элемент. И пользуясь индексированием по указателю - мы имеем законное право пройти хоть всю память. Но мы идём лишь до последнего элемента. Что не так? Стрикт алиайзинг? Сам компилятор пользуется адресной арифметикой. Я не имел ввиду такие экзотические типы как bool (обычно 1 байт) и не думаю, что выравнивание как-то может помешать. Это потому, что размер массива всегда равен n*sizeof(T) если количество элементов n (независимо от количества измерений), а Т - тип конечного элемента.Добавлено через 10 минут int об этом не догадывается и ему-то, как раз, не нужно слабительное.
1
|
|||
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|||
| 10.01.2019, 00:09 | |||
|
0
|
|||
|
Комп_Оратор)
|
||
| 10.01.2019, 00:28 | ||
|
Что касается некорректности обращения к адресному пространству массива через указатель на его первый элемент - не убедительно. Вообще.
0
|
||
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
| 10.01.2019, 12:22 | |
|
Всё-таки нужно сделать финальное уточнение. UB ещё до выхода за границы наступает в C++17. До C++17 UB будет из-за выхода за границы.
0
|
|
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
||||||||||
| 10.01.2019, 13:13 | ||||||||||
int. Так что очень даже similarЕщё, ожидаемо, что двух-мерный массив : int a[][3] ={ {1,2,3}, {4,5,6}, {7,8,9} }; будет хранить свои элементы в памяти именно в такой последовательности, в какой они указанны при инициализации. Вот так: один за другим, в одном непрерывном блоке памяти. Ещё, ожидаемо, что указатель: int* pa =reinterpret_cast<int*>(a);Будет указывать на первый элемент двух-мерного массива. И теперь, почитав внимательно раздел 8.7 Additive operators, Вы верно поймете, что указатель p1:
4поведение определено: по адресу, который хранит p1 обязан находиться объект типа int, со значением 4.Добавлено через 2 минуты Я понимаю, что некоторые люди - альтернативно одаренные. Мыслят каким то странным образом. Всё же, где вы там увидели выход за пределы диапазона? ![]() Добавлено через 21 минуту ![]() Чужую память даже просто читать нельзя, без риска нарваться на access violation Добавлено через 3 минуты
1
|
||||||||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,097
|
|||||||||||
| 10.01.2019, 13:44 | |||||||||||
|
Примерно этим пользуются при вызове функций memset(), memcpy() и т.п.: неважно сколько измерений у массива, это просто непрерывный блок байтов. . Ну и вернусь немного назад во времени чтобы разобраться с порядком хранения элементов в многомерном массиве. Похоже, моя первая модель была неудачной, попробую другую:
0
|
|||||||||||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
|||
| 10.01.2019, 13:58 | |||
|
Это же UB. Есть ссылочка на pdf? (C++03: N1577, N1655, N1733)
0
|
|||
|
Неэпический
|
||
| 10.01.2019, 14:08 | ||
return *"";Ну и, скорее всего, там в любом случае есть нолик в конце строки. Не выделять же каждый раз память под c_str,поэтому return data[pos] будет нормально работать.
0
|
||
| 10.01.2019, 14:08 | |
|
В чем разница между массивом строк и List<string>? Разница между статическим и экземплярным методом В чем разница между простым линейным списком, и динамическим линейным списком? Разница между массивом структур и очередью VPN не подключается со статическим IP-адресом (ошибка 720), с динамическим — все работает Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|