Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Практикантроп
 Аватар для nick42
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
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2013, 17:31
Ответы с готовыми решениями:

Откуда появляются эти числа?
Ошибка найдена

Откуда берется мусор при создании массива типа char?
Добрался до темы книги "потоки и файлы". Решил написать небольшую программу генератора кода. В общем код пишут, но в конце еще...

Фиксированный размер массива char
Привет. Необходимо записать некоторые данные, которые дёргаются из базы, в бинарный файл. Структура файла чётко определена и под...

12
 Аватар для dr.curse
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
18.07.2013, 17:39
nick42, функция созается на стеке и ее локальные переменные тоже и этим переменным просто нехватает места, а размер стека это implementation defined и поэтому там разные цифры

P.S. все что сказано мое личное мнение и может быть неправильным
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33401 / 21511 / 8236
Регистрация: 22.10.2011
Сообщений: 36,911
Записей в блоге: 12
18.07.2013, 17:43
Это связано с размером стэка, где и располагаются все локальные переменные. Опиши переменную как static - она будет расположена не в стэке, в а сегменте данных, программа продолжит работать, правда?

По умолчанию этот размер (я про стэк) равен 0x00100000 = 1048576, но не только же один массив в нем размещается... Настраивается здесь (это в новых версиях Билдера, про старые ничего сказать не могу, давно не использую): C++ Linker Output
2
 Аватар для dr.curse
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
18.07.2013, 17:44
Цитата Сообщение от UI Посмотреть сообщение
По умолчанию этот размер (я про стэк) равен 0x00100000 = 1048576, но не только же один массив в нем помещается...
UI, но я где-то читал что это зависит от копилятора, поскольку стандарт про это молчит
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33401 / 21511 / 8236
Регистрация: 22.10.2011
Сообщений: 36,911
Записей в блоге: 12
18.07.2013, 17:46
Раз стандарт молчит - значит, надо смотреть документацию производителя. Я привел ссылку именно на неё...
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.07.2013, 17:53  [ТС]
UI, большое спасибо! пока логично, но по ходу появился еще вопрос: при объявлении переменной вот так "в стэке" она же не обнуляется (пока явно не приравнять к нулю)? А в моих экспериментах получается, что инициализируемый массив обнуляется и "хвостом", который не помещается в стэк, подчищает начало стэка, вследствие чего происходит крах (я не настаиваю на таком объяснении; это чисто по интуиции... - если корректировать адрес по маске &0xFFFFF, то так и будет)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.07.2013, 21:56
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от nick42 Посмотреть сообщение
А в моих экспериментах получается, что инициализируемый массив обнуляется
Это потуги авторов компилятора облегчить жизнь лохам. Они встраивают в код операции по обнулению всех локалов (это настраивается то ли опцией, то ли зависит от режима Debug/Release)

Что касается стека, то операционная система отводит каждому процессу некоторый размер стека. Далее каждая функция пытается отхватить себе требуемый размер стека. Процесс "отхватить" на intel'овском процессоре (да и на большинстве других) выражается в то, что из stack pointer'а вычитается требуемая величина (стек растёт в сторону уменьшения адресов) и полученное значение обратно записывается в stack pointer. Никакого контроля за тем, что мы находимся в допустимом диапазоне адресов, не осуществляется. Делается это с целью ускорения программы, потому как если мы вывалились за диапазон и попытались полезть в стек, то операционная система такой процесс прибьёт.

Лечение таких проблем - все большие массивы выделять динамически, т.к. процесс динамического выделения памяти можно контролировать (т.е. можно понять, сумели мы выделить память, или нет)
3
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.07.2013, 22:01  [ТС]
А разве классическое понимание "стэка" и heap - это одно и то же? Как можно, скажем, массив структур размещать в стэке? Нет, можно, конечно, но это уродство какое-то...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.07.2013, 22:43
Если честно, то я вопроса не понял. И heap и стек - с точки зрения машины это одинаковая память, которая отличается только с точки зрения организации страничной памяти операционной системы
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.07.2013, 22:55  [ТС]
Ну стэк - что такое.... такая же память. Имеется указатель (адрес) на его "вершину"; положить в стэк означает записать в ячейку данные, при этом указатель уменьшается в значении на эту одну ячейку. Вершина понижается. Удобство (и скорость) в том, что не нужно отслеживать адрес записи - он автоматически корректируется после операций со стэком. Это, так сказать, классика. А heap - это "куча"; тоже по своему организованная, со своими ограничениями и т.д. Стэк активно используется в прерываниях, при вызове подпрограмм, для временного сохранения регистров... . Существуют, как я слышал, двухстэковые машины... . Все-таки heap - это должно быть нечто другое.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
19.07.2013, 11:30
Цитата Сообщение от nick42 Посмотреть сообщение
Ну стэк - что такое.... такая же память. Имеется указатель (адрес) на его "вершину"; положить в стэк означает записать в ячейку данные, при этом указатель уменьшается в значении на эту одну ячейку. Вершина понижается. Удобство (и скорость) в том, что не нужно отслеживать адрес записи - он автоматически корректируется после операций со стэком
Так, как ты описал, скорее работает теоретический абстрактный стек. В реальной жизни оно совсем не так

Цитата Сообщение от nick42 Посмотреть сообщение
А heap - это "куча"; тоже по своему организованная, со своими ограничениями и т.д. Стэк активно используется в прерываниях, при вызове подпрограмм, для временного сохранения регистров... . Существуют, как я слышал, двухстэковые машины... . Все-таки heap - это должно быть нечто другое
Если это было пояснение вопроса

Цитата Сообщение от nick42 Посмотреть сообщение
Как можно, скажем, массив структур размещать в стэке?
то я его по прежнему не понимаю
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
19.07.2013, 11:33  [ТС]
Evg, спасибо за ответы!
Моих познаний даже в области структуры Пентиума явно не достаточно, чтобы вести дискуссию. Увы...
0
 Аватар для System16v
3 / 3 / 1
Регистрация: 19.02.2014
Сообщений: 115
21.04.2015, 22:21
Не знаю где спросить,но по сути вопрос похож.Может кто подсказать на счет так же размера.Что за ерунда такая... Написал код,массив указателей на функции.При вызове функции выбирается рандомно слово и присваивается новому массиву.Остальные слова добавляются в этот массив.Так вот все вроде бы работает и выдает нормально.Но, потребовалось увеличить размер массива.Увеличил и все...Программа запускается и сразу вываливается ошибка.Что это такое? Пробовал размер задать через константную переменную.Все равно ошибку выдает. С размером 200 - запускается и работает,с 500 уже сыпет ошибку.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <math>
#include <cstdlib>
#include <iomanip>
 
using namespace std;
 
void article(char *);
void noun(char *);
void verb(char *);
void preposition(char *);
 
int l=0;
 
int main()
{
 srand(time(0));
 void (*f[4])(char *)={article,noun,verb,preposition};
 static const int size=200;
 char *array[size];
 int t=0;
 while(t!=4)
 {
 (*f[t])(*array);
  t++;
  if(t==4)
  {
   (*f[0])(*array);
   (*f[1])(*array);
  }
 }
 
   cout << *array;
 
 
 cout << endl;
 system("pause");
 return 0;
}
void article(char *w1)
{
  int s=0;
  char *ar[]={"the","a","one","some","any"};
  s=rand()%5;
  if(l==0)
  {
    strcpy(w1,ar[s]);
    strcat(w1," ");
    if(islower(w1[0]))
      w1[0]=toupper(w1[0]);
  }
  else
  {
  strcat(w1,ar[s]);
  strcat(w1," ");
  }
  l++;
}
void noun(char *w2)
{
  int s1=0;
  char *ar1[]={"boy","girl","dog","town","car"};
  s1=rand()%5;
  strcat(w2,ar1[s1]);
  if(l<=1)
  strcat(w2," ");
  if(l>1)
  strcat(w2,".");
}
void verb(char *w3)
{
  int s2=0;
  char *ar2[]={"drove","jumped","ran","walked","skipped"};
  s2=rand()%5;
  strcat(w3,ar2[s2]);
  strcat(w3," ");
}
void preposition(char *w4)
{
  int s3=0;
  char *ar3[]={"to","from","over","on"};
  s3=rand()%4;
  strcat(w4,ar3[s3]);
  strcat(w4," ");
}
В чем же причина?

Добавлено через 30 минут
Порылся изменил на
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 int size=1000;
 char *array=new char[size];
 int t=0;
 while(t!=4)
 {
 (*f[t])(array);
  t++;
  if(t==4)
  {
   (*f[0])(array);
   (*f[1])(array);
  }
 }
Все работает без ошибок.Я так понял,оператором нью выделилось столько памяти сколько конкретно я указал?А до этого выделялось как?И еще интересует почему теперь при вызовах функции пришлось указывать аргумент array,а без оператор new указывать нужно было *array.Собственно в чем разница,и что произошло? Т.е. как бы массив указателей на функции то не изменился и остался таким же
C++
1
 void (*f[4])(char *)={article,noun,verb,preposition};
,а вот при вызове почему теперь нужно использовать не указатель?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.04.2015, 22:21
Помогаю со студенческими работами здесь

Откуда эти цифры?
Здравствуйте, программисты. label 1, 2; begin i:=6; 2: if i&lt;0 then goto 1; write(i); Dec(i); goto 2; 1:

Откуда эти миллионы
вот что мне показала сегоняшняя аналитика отчего может быть такой глюк??картинка

Откуда эти источника трафика?
Я не размещал там ни баннеров ни ссылок.Откуда взялись эти переходы? это могут быть конкуренты?

Откуда берутся эти ссылки?
В общем проблема такая. Создаю я новость (Заметку), сохраняю, и почему то все тело статьи превращается в ссылку типа...

Удалить из массива все нечетные числа и вывести размер полученного массива и его содержимое
Помогите пожалуйста решить 3 задачи в делфи на массивы:(нужно получить допуск к экзамену)))) 1. Дан целочисленный массив размера N....


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

Или воспользуйтесь поиском по форуму:
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, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru