Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/263: Рейтинг темы: голосов - 263, средняя оценка - 4.76
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

В чем разница между динамическим массивом и статическим?

07.01.2019, 11:59. Показов 58046. Ответов 220
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ребята, я не понимаю различия. вроде читал литературу.

ну вот говорят, что динамический массив, это массив выделение памяти под который будет происходит в процессе выполнения программы.

и тут я залез в онлайн компилятор (с++ 14) и сделал так
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main(){
 
int n;
std::cin >> n;
int array[n]; // ну я создал посути динамический массив.
 
int *arr;
arr=new int[n]; // здесь тоже. 
return 0;
}
 
значит они оба динамические?
объясните пожалуйста в чем действительно разница между статическим и динамическим массивом, чтобы я мог точно понимать что есть что
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.01.2019, 11:59
Ответы с готовыми решениями:

Разница между статическим и динамическим полиморфизмом
Добрый день Подскажите пожалуйста какая разница между статическим и динамическим полиморфизмом и пожалуйста на примере и virtual...

В чем разница между вектором и массивом
Я учу язык С/С++ и хотел у вас спросить в чем разница между вектором и массивом ? кроме тогдо что вектор создается vector<int> m; а...

В чем разница между обычным массивом и контейнером
В чем разница между обычным массивом и контейнером?

220
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
10.01.2019, 22:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rat0r Посмотреть сообщение
Можно конкретный код увидеть?
C++
1
2
3
4
5
6
static char dummy = 0;
static char* pdummy = &dummy;
 
....
 
reinterpret_cast<T*>(pdummy)->member;
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
10.01.2019, 22:47
https://en.cppreference.com/w/cpp/language/pointer
Comparison operators are defined for pointers to objects in some situations: two pointers that represent the same address compare equal, two null pointer values compare equal, pointers to elements of the same array compare the same as the array indexes of those elements, and pointers to non-static data members with the same member access compare in order of declaration of those members.

Many implementations also provide strict total ordering of pointers of random origin, e.g. if they are implemented as addresses within continuous virtual address space. Those implementations that do not (e.g. where not all bits of the pointer are part of a memory address and have to be ignored for comparison, or an additional calculation is required or otherwise pointer and integer is not a 1 to 1 relationship), provide a specialization of std::less for pointers that has that guarantee. This makes it possible to use all pointers of random origin as keys in standard associative containers such as std::set or std::map.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
10.01.2019, 22:52
Цитата Сообщение от eva2326 Посмотреть сообщение
reinterpret_cast
Запрещён в константных выражениях.
offsetof — разрешён.

Следовательно, offsetof через reinterpret_cast не реализуешь.

Какая будет следующая попытка?

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Toshkarik Посмотреть сообщение
дальше с таким хамом не вижу смысла что то обсуждать.
Да, будет здорово, если ты избавишь меня от своего тупняка.

0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
10.01.2019, 22:54
Цитата Сообщение от Croessmah Посмотреть сообщение
Это сделано разработчиками компилятора, в их коде это нормально. И использование std::less для сравнения указателей законно.
Мне казалось, что less законен для указателей только в тех случаях, что и при обычном сравнении. Иначе похоже на хак какой то.
Цитата Сообщение от Croessmah Посмотреть сообщение
В стандартной библиотеке такой код - нормально.
В коде пользователя - плохо.
Имеется ввиду тот, что я привел из gcc? Ну да, он нечитабельный. Разговор же о том, что less можно реализовать "в отрыве" от компилятора. И в коде реализации less в gcc, хоть он и нечитабельный и используются какие то встроенные функции для оптимизации, все же не использует именно для работы какие то специфические штуки. Я же привел пример. Каст указателя к целому вполне легален. Если нет uintptr_t, то можно найти тот целочисленный тип, который вместит в себе указатель. И это не будет UB и будет реализовано штатными средствами.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
10.01.2019, 22:58
Цитата Сообщение от Toshkarik Посмотреть сообщение
Каст указателя к целому
1. Запрещён в константных выражениях, когда как std::less для указателей (пока) можно использовать в константных выражениях.
2. implementation-defined и не гарантирует, что результирующие целые числа будут упорядочены как требуется.

Добавлено через 1 минуту
Цитата Сообщение от Toshkarik Посмотреть сообщение
можно найти тот целочисленный тип, который вместит в себе указатель
Такой вообще не обязан существовать.
0
10.01.2019, 23:00

Не по теме:

rat0r, Будьте добры, избавьте меня от вашего тупняка тоже, это будет честно.

0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
11.01.2019, 00:11
Цитата Сообщение от rat0r Посмотреть сообщение
Запрещён в константных выражениях.
wtf?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.01.2019, 10:51
Цитата Сообщение от eva2326 Посмотреть сообщение
wtf?
Не проходили константные выражения ещё?
1
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,095
11.01.2019, 11:09
Цитата Сообщение от Toshkarik Посмотреть сообщение
Пруфы в стандарте. Покупаете его, открываете и ищете. За вас я делать это не собираюсь. Это базовые вещи, которые написаны в любом вменяемой учебнике по данным языкам.
А раз доказательств нет, незачем и воздух попусту сотрясать.
Цитата Сообщение от eva2326 Посмотреть сообщение
Кем то.
Во время компиляции программе неоткуда знать кто и где ей выделит память. Например, будет ли содержать UB код (*(volatile uint8_t*)((0x38)) = 1;? Это прямая запись числа 1 по адресу 0x38.
Кликните здесь для просмотра всего текста
Это код для ATmega8, запись 1 в PORTB, то есть вывод на 14 ножку напряжения питания, а на 9, 10, 15-19 напряжения земли. Самый что ни наесть штатный способ

Цитата Сообщение от eva2326 Посмотреть сообщение
Вылет за пределы диапазона массива, например.
Я говорю не о массивах, а об указателях и областях памяти. Выход за пределы массива, естественно, UB. Запись в рандомную ячейку памяти (не путать с выбранной вручную) - UB. Просто потому что программист не может предсказать что там будет находиться. Но это не тот случай.
Цитата Сообщение от eva2326 Посмотреть сообщение
У вас есть указатель, который указывает на протухший объект.
Формально, такой указатель - невалидный.
Разумеется, но мы ведь говорим не об этом.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
11.01.2019, 11:19

Не по теме:

COKPOWEHEU, твой процессор до сих пор без циклов работает?

1
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
11.01.2019, 11:19
Цитата Сообщение от rat0r Посмотреть сообщение
Не проходили константные выражения ещё?
Не очевидно, откуда вы берете такую чушь,
что что якобы reinterpret_cast запрещено использовать в константных выражения.
0
11.01.2019, 11:24

Не по теме:

скоро офтопнутую тему прикроют.

0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.01.2019, 11:24
Цитата Сообщение от eva2326 Посмотреть сообщение
Не очевидно, откуда вы берете такую чушь,
что что якобы reinterpret_cast запрещено использовать в константных выражения.
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это базовые вещи, которые написаны в любом вменяемой учебнике по данным языкам.
...
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
11.01.2019, 11:25
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Во время компиляции программе неоткуда знать кто и где ей выделит память.
Ей и не нужно этого знать.
Это знает программист.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Например, будет ли содержать UB код (*(volatile uint8_t*)((0x38)) = 1;?
implementation-defined behavior
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
11.01.2019, 11:26
Цитата Сообщение от eva2326 Посмотреть сообщение
Во время компиляции программе неоткуда знать кто и где ей выделит память
кто и когда знает, а вот сколько не знает.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.01.2019, 11:27
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А раз доказательств нет, незачем и воздух попусту сотрясать.

Не по теме:

Вот и не сотрясайте его :)



Цитата Сообщение от _stanislav Посмотреть сообщение
скоро офтопнутую тему прикроют.

Не по теме:

Но время еще есть! :D

0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
11.01.2019, 11:27
Цитата Сообщение от rat0r Посмотреть сообщение
...
не нужно ссылаться на господина Toshkarik,
вырывая его цитаты из контекста, и прикрывать ими собственную глупость.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.01.2019, 11:29
eva2326, предъяви уже свою версию offsetof через reinterpret_cast, проверим её поведение в сравнении с offsetof из библиотеки.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
11.01.2019, 11:37
Цитата Сообщение от _stanislav Посмотреть сообщение
кто и когда знает, а вот сколько не знает.
хотя где и когда тоже может не знать.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
11.01.2019, 15:54
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот еще пример подобного явления: Почему не происходит разыменования нулевого указателя?
11.3.2 References
5 There shall be no references to references, no arrays of references, and no pointers to references. The
declaration of a reference shall contain an initializer (11.6.3) except when the declaration contains an explicit
extern specifier (10.1.1), is a class member (12.2) declaration within a class definition, or is the declaration
of a parameter or a return type (11.3.5); see 6.1. A reference shall be initialized to refer to a valid object or
function. [ Note: In particular, a null reference cannot exist in a well-defined program, because the only way
to create such a reference would be to bind it to the “object” obtained by indirection through a null pointer,
which causes undefined behavior.
Здесь говорится, что в правильной программе не может быть нулевых ссылок,
так как, для того, что бы их получить, необходимо разыменовать нулевой указатель,
что в свою очередь является UB.

Если посмотреть ассм-листинг, то будет видно,
что компилятор генерирует код получения адреса, а так же значения по адресу.
Адрес оказывается невалидным.
И в рантайме процесс падает от акцесс-виолэйшен.

Но что, если мы не хотим запускать процедуру разыменовывания указателя?
Что, если фактически, никакого действия не происходит?


Вот это - законная конструкция:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <type_traits>
#include <typeinfo>
#include <iostream>
 
#define deduce(class_name, member) \
    decltype(std::declval<class_name>().member)
 
struct some
{
    int member;
};
 
int main()
{
    using type = deduce(some, member);
    std::cout << typeid(type).name() << std::endl;
}
std::declval внутри себя порождает "нулевую ссылку",
используется только и только в расчетах времени компиляции.

template <class T>
typename add_rvalue_reference<T>::type declval() noexcept;
Declaration value
Returns an rvalue reference to type T without referring to any object.

This function shall only be used in unevaluated operands (such as the operands of sizeof and decltype).

T may be an incomplete type.

This is a helper function used to refer to members of a class in unevaluated operands, especially when either the constructor signature is unknown or when no objects of that type can be constructed (such as for abstract base classes).

времени компиляции гарантируется,
что её нельзя задействовать времени выполнения:
error: static assertion failed: declval() must not be used!
теперь проворачиваем все тоже самое,
только без явного применения std::declval,
но так же "unevaluated operands"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <type_traits>
#include <typeinfo>
#include <iostream>
 
#define deduce(class_name, member) \
    decltype(static_cast<class_name*>(nullptr)->member)
 
struct some
{
    int member;
};
 
int main()
{
    using type = deduce(some, member);
    std::cout << typeid(type).name() << std::endl;
}
Синтаксически - да, была применена операция разыменовывания указателя.
Однако, она фигурирует как параметр decltype
И следовательно, попадает под правила, которые описывают как работает decltype
Согласно этим правилам, никакого реального запуска функции разыменовывания не происходит.
Никакой встроенной операции разыменовывания так же не происходит.

А значит, никакого разыменовывания по факту вообще не было.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <type_traits>
#include <typeinfo>
#include <iostream>
#include <cstddef>
 
#define deduce(class_name, member) \
    decltype(static_cast<class_name*>(nullptr)->member)
 
struct some
{
    int member;
};
 
int main()
{
    enum { value = offsetof(some, member) } ;
    
    std::cout << "offset = " << value << std::endl;
}
А раз нет никакого разыменовывания,
значит и UB связанного с ним так же никакого нет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2019, 15:54

В чем разница между массивом строк и List<string>?
А есть ли принципиальная разница между string array1 и List&lt;string&gt; array2 ? И если есть, то в чем она заключается?

Разница между статическим и экземплярным методом
В книге уже несколько раз встречается понятие статического и экземплярного метода, но не поясняется конкретно, в чем между ними разница,...

В чем разница между простым линейным списком, и динамическим линейным списком?
вопрос в теме

Разница между массивом структур и очередью
Поясните пожалуйста разницу между массивом структур и очередью.

VPN не подключается со статическим IP-адресом (ошибка 720), с динамическим — все работает
Всем привет! В магазине имеется VPN соединение подключающееся к серверу на складе. При получении ip-адреса автоматически подключение...


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

Или воспользуйтесь поиском по форуму:
220
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru