|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|
Размер массива char. - откуда эти числа?18.07.2013, 17:31. Показов 3140. Ответов 12
Метки нет (Все метки)
Возникла у меня-дилетанта одна непонятка: вот если внутри какой либо функции (обработчика) инициализирую массив char с явным указанием его размера (может это правильно по другому называется... - но смысл такой: char buffer[400] ; ), то, независимо от задаваемого размера компилятор недовольства не выказывает. Но при работе программы при обращении к этой функции происходит тихий крах программы. И эта неприятность зависит от размера массива каким-то странным образом: для BCB 5 предел "слета" получился 1025824, - если задать больше, то крах, а меньше - работает. Причем, если переменную задать глобально - там этого нет. Для 6-й версии Билдера число было другим: 1027628. Я чувствую, что это связано с оперативной памятью, вернее - с размещением в ней моей программы. Но не могу понять, каким образом, и как избежать этого? Знатоки теории, подскажите, где реально предел байтового массива при таком его определении? Как избежать ошибок ? (.."читать теорию" принимается безропотно...).
0
|
|
| 18.07.2013, 17:31 | |
|
Ответы с готовыми решениями:
12
Откуда появляются эти числа? Откуда берется мусор при создании массива типа char? Фиксированный размер массива char |
|
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
|
|
| 18.07.2013, 17:39 | |
|
nick42, функция созается на стеке и ее локальные переменные тоже и этим переменным просто нехватает места, а размер стека это implementation defined и поэтому там разные цифры
P.S. все что сказано мое личное мнение и может быть неправильным
1
|
|
|
Супер-модератор
|
|
| 18.07.2013, 17:43 | |
|
Это связано с размером стэка, где и располагаются все локальные переменные. Опиши переменную как static - она будет расположена не в стэке, в а сегменте данных, программа продолжит работать, правда?
По умолчанию этот размер (я про стэк) равен 0x00100000 = 1048576, но не только же один массив в нем размещается... Настраивается здесь (это в новых версиях Билдера, про старые ничего сказать не могу, давно не использую): C++ Linker Output
2
|
|
|
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
|
||
| 18.07.2013, 17:44 | ||
|
1
|
||
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|
| 18.07.2013, 17:53 [ТС] | |
|
UI, большое спасибо! пока логично, но по ходу появился еще вопрос: при объявлении переменной вот так "в стэке" она же не обнуляется (пока явно не приравнять к нулю)? А в моих экспериментах получается, что инициализируемый массив обнуляется и "хвостом", который не помещается в стэк, подчищает начало стэка, вследствие чего происходит крах (я не настаиваю на таком объяснении; это чисто по интуиции... - если корректировать адрес по маске &0xFFFFF, то так и будет)
0
|
|
|
|
||
| 18.07.2013, 21:56 | ||
Сообщение было отмечено как решение
РешениеЧто касается стека, то операционная система отводит каждому процессу некоторый размер стека. Далее каждая функция пытается отхватить себе требуемый размер стека. Процесс "отхватить" на intel'овском процессоре (да и на большинстве других) выражается в то, что из stack pointer'а вычитается требуемая величина (стек растёт в сторону уменьшения адресов) и полученное значение обратно записывается в stack pointer. Никакого контроля за тем, что мы находимся в допустимом диапазоне адресов, не осуществляется. Делается это с целью ускорения программы, потому как если мы вывалились за диапазон и попытались полезть в стек, то операционная система такой процесс прибьёт. Лечение таких проблем - все большие массивы выделять динамически, т.к. процесс динамического выделения памяти можно контролировать (т.е. можно понять, сумели мы выделить память, или нет)
3
|
||
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|
| 18.07.2013, 22:01 [ТС] | |
|
А разве классическое понимание "стэка" и heap - это одно и то же? Как можно, скажем, массив структур размещать в стэке? Нет, можно, конечно, но это уродство какое-то...
0
|
|
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|
| 18.07.2013, 22:55 [ТС] | |
|
Ну стэк - что такое.... такая же память. Имеется указатель (адрес) на его "вершину"; положить в стэк означает записать в ячейку данные, при этом указатель уменьшается в значении на эту одну ячейку. Вершина понижается. Удобство (и скорость) в том, что не нужно отслеживать адрес записи - он автоматически корректируется после операций со стэком. Это, так сказать, классика. А heap - это "куча"; тоже по своему организованная, со своими ограничениями и т.д. Стэк активно используется в прерываниях, при вызове подпрограмм, для временного сохранения регистров... . Существуют, как я слышал, двухстэковые машины... . Все-таки heap - это должно быть нечто другое.
0
|
|
|
|
||||
| 19.07.2013, 11:30 | ||||
|
0
|
||||
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|
| 19.07.2013, 11:33 [ТС] | |
|
Evg, спасибо за ответы!
Моих познаний даже в области структуры Пентиума явно не достаточно, чтобы вести дискуссию. Увы...
0
|
|
|
3 / 3 / 1
Регистрация: 19.02.2014
Сообщений: 115
|
||||||||||||||||
| 21.04.2015, 22:21 | ||||||||||||||||
|
Не знаю где спросить,но по сути вопрос похож.Может кто подсказать на счет так же размера.Что за ерунда такая... Написал код,массив указателей на функции.При вызове функции выбирается рандомно слово и присваивается новому массиву.Остальные слова добавляются в этот массив.Так вот все вроде бы работает и выдает нормально.Но, потребовалось увеличить размер массива.Увеличил и все...Программа запускается и сразу вываливается ошибка.Что это такое? Пробовал размер задать через константную переменную.Все равно ошибку выдает. С размером 200 - запускается и работает,с 500 уже сыпет ошибку.
Добавлено через 30 минут Порылся изменил на
0
|
||||||||||||||||
| 21.04.2015, 22:21 | |
|
Помогаю со студенческими работами здесь
13
Откуда эти цифры? Откуда эти миллионы Откуда эти источника трафика? Откуда берутся эти ссылки?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|