LINUX.ORG.RU

Массив

 


2

1

Можете объяснить почему

main(){
int *A=new int[5];

*(A+6)=1000;
*(A+10)=5555;
*(A+20)=9999;
//почему , если продолжать то ошибка?

Я же использую динамическую память. Ее что выделяется опр количество. Почему тогда ошибка всегда на определенном количестве элементов, созданных таким образом?

}


Ошибка у тебя уже на строке (*A + 6) = 1000; Если вопрос в том, почему не падает - это называется неопределённое поведение. Хочет - падает, хочет - не падает, хочет - форматирует диск, может быть что угодно. Конкретно в твоём случае вероятно аллокатор выделяет не 5 int-ов, а больше, поэтому ошибка проявляется не сразу.

Legioner ★★★★★
()

Я же использую динамическую память. Ее что выделяется опр количество.

Динамическая - значит её можно выделять и освобождать в процессе работы программы. Это не значит, что выделенный объём можно сколь угодно расширять используемым вами образом.

В вашем примере выделяется объём памяти, равный 5 int. При попытке записи вне выделенного объёма поведение программы не определено.

Rootlexx ★★★★★
()

С и С++ многое позволяют программисту, если хочешь чтобы тебя по рукам били когда ты пишешь что-то не то, то пиши на других языках, например Rust.

Если ты любишь писать на С и С++, то можешь попробовать всякие статические анализаторы: cppcheck, PVS-studio, clang-tidy, встроенный в Visual Studio, или другие…

Например твой пример в online cppcheck:

http://cppcheck.sourceforge.net/demo/

void f()
{
    int *A=new int[5];

    *(A+6)=1000;
    *(A+10)=5555;
    *(A+20)=9999;
}
[test.cpp:5]: (error) Array 'A[5]' accessed at index 6, which is out of bounds.
[test.cpp:6]: (error) Array 'A[5]' accessed at index 10, which is out of bounds.
[test.cpp:7]: (error) Array 'A[5]' accessed at index 20, which is out of bounds.
[test.cpp:8]: (error) Memory leak: A
fsb4000 ★★★★★
()

Я же использую динамическую память.

Нет, по крайней мере не в том смысле, в котором ты понимаешь динамическую память. Ты создаешь массив из 5 элементов, после чего объявляешь какой-то левый указатель фиг пойми куда и пытаешься что-то там разместить. Компилятор волен трактовать подобное как угодно, хоть открытием порнхаба в браузере.

peregrine ★★★★★
()
Ответ на: комментарий от hotpil

До скольки продолжали? Восемь подобных строк и все? Почему то это предел

LGH
() автор топика
Ответ на: комментарий от peregrine

Ребята, спасибо что откликнулись и осветили тему.

Честно , я не могу заглянуть в и увидеть своими глазами, как и где память выделяется. Я знаю немного, поэтому задал вопрос вам, уважаемые форумчане. Что касается того правильно или нет я понимаю, что такое динамическая память, то могу сказать, имею только скромное познание. Такое отличие динамической памяти от статической и стековой , на мой вгляд, главной частью состоит в том, что происходит выделение памяти в куче, на эту область создается указатель. То что динамическая память выделяется в процессе выполнения программы, меня настораживает. Как же тогда динамический массив? Что бы мне мешало менять его размерность в ходе этой программы без пререзаписи? Пктем добавления нужного количества ячеек, к уже имеющейся памяти.

Тут стековую память и статическую. Стековая интересна очень. После , если вы будете иметь желание дать хоть какой то ответ, то задам вопрос в отдельной теме. Суть стековой, как я понял и немого опробовал, в том, что она автоматическая. То есть автоматически создается и уничтожается, в отличии от динамической, кстати… стек очень интересная тема. Думаю будет возможность и его затронуть. Переменные , которые локальные, всегда будут на стеке. Получается, что все переменные объвленные в main-локальны. Переменные объявленные main будут лежать на стеке.
СТоп, а как же динамическая память. Ну я понял так, что указатель, а это переменная, будет лежать на стеке и содержать в себе адрес на выделенную область памяти. Вроде не сильно разнится с правильным пониманием.

LGH
() автор топика
Ответ на: комментарий от LGH

Че-то ты какую-то пургу пишешь. Ты же выделил массив из 5 int. Всё. Вот и пиши в эти 5 «ячеек», динамическая - это когда ты вместо 5-ки указываешь переменную, и уже от неё создаётся размерность твоего массива. Вообще, для таких вещей юзают malloc/calloc, либо модные аллокаторы типа jemalloc, для тебя есть ещё http://libcello.org/

menangen ★★★★★
()
Ответ на: комментарий от LGH

Ну я понял так, что указатель, а это переменная, будет лежать на стеке и содержать в себе адрес на выделенную область памяти.

Попробуйте остановиться генерировать магические догадки и поразмыслить над разницей «выделение памяти» и вашим примером, где вы выделяете чуток, а вот используете за границами этого выделения.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от menangen

В вижуал студио пишешь?

Я могу и так int n=5; int A[n]; Что динамический? Вы работаете программистом, или хобби?

LGH
() автор топика
Ответ на: комментарий от hotpil

Указатель , -это пременная, которая содержит адрес. Когда делаю вот так

int main()
{
int* V =new int;

}
То указатель V будет лежать на стеке, и указывать адрес в памяти, что в куче.

LGH
() автор топика
Ответ на: комментарий от LGH

Содержать адрес на память, что в куче))))

LGH
() автор топика
Ответ на: комментарий от menangen

Заходи пожалуйста чаще…. интересный ты человек.

LGH
() автор топика
Ответ на: комментарий от LGH

В чем неправ.

Если вы были б правы, то оно бы у вас же работало? Простейшая же логика.

Конкретнее пожалуйста

А не надо изучать методом тыка, на форуме. Вам и так и сяк уже всё рассказали, а обучать никто не обязан.

vodz ★★★★★
()
Ответ на: комментарий от vodz

100 процентов не прошу обучать. Я просто виду диалог. Я спросил в чем неправ поповоду статической и динамической памяти. Мне сказали что я непонимаю неправильно. Я написал как понимаю, чтобы поправили.

Вот и все. Просто жду когда скажут в где ж я неправильно понимаю.

А вы о чем? Какое разжевывание? Кагда такое было, чтобы на ЛОРе разжевывали? Искривляете вы батенька!

LGH
() автор топика
Ответ на: комментарий от LGH

Главное не путать статическое и динамическое выделение памяти с DRAM, SRAM и кешем. Стековая память вообще из другой оперы и я бы даже не стал выделять её как особую память, скорее это к структуре стек относится, других абстракций в этом месте не требуется. LIFO FIFO и всё, а то ещё и про страничную и сегментную память вспомнить можно, но это тоже из другой оперы.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от LGH

вам возможно для правильного понимания предстоит прежде чем понимать правильно не только перестать не понимать неправильно, но и достаточное время не понимать правильно.

ваши ошибки как и ваши успешки есть разного порядка малости(большести(унимодальности))

допустим вопрос из стартового поста всё ещё вами непонимается неправильно и при этом всё ещё не( понимается правильно) так и ни(понимается правильно)

и так.

что сказано в стандарте того Си которого компилятор вам с некоторого индекса выдал ошибку ( какую кста?)?

qulinxao3 ★☆
()
Ответ на: комментарий от LGH

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

Ладно. Допустим один раз, что вы просто тормозите.

Итак, статическая память:

int array1[5];
...
main()
{
    static int array2[5];
}

Тут компилятор выделит по 5 ячеек каждому массиву, если в этих ... точек других переменных больше не объявляется, то с большой вероятностью эта память будет статически (то есть без изменения в процессе работы) располагаться рядом, вначале идут 5 int-а для array1, а потом сразу же для array2, то есть записывая array1[5]=1 вы тем самым пишите в 0-ю ячейку array2, а не расширяете array1.

Выделение памяти из стека с константным или вычисляемым размером expr:

foo()
{
    int array3[expr];
}
Тут компилятор выделит память из стека в процессе выполнения, с размером, который может быть не константой в этом коде.

Выделение памяти из кучи под массив с константным или вычисляемым размером:

foo()
{
    int *A=new int[expr];
}

А теперь сравните с вашим первым постом. Вы выделили память на 5 ячеек, а используете больше. Не надо путать разные языки, там где массивы самостоятельно расширяются, там и предварительного выделения то как правило нет.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Со static вы как то уж просто все.
В данном случае, массив локален, раз создан в функции main, о должен был бы весь лежать на стеке. Но если я приминяю statiс то область памяти под массив будет выделена в статической области. Про не изменяемость глупость сказали.

И это лишь одно из лиц этого модификатора.

LGH
() автор топика

Для автобуса длинной 5 метров построили гараж длинной 5 метров за ним через тропику здание отделения полиции, автобус удлинили на метр и бухой водитель протаранил стену гаража так что автобус въехал и метр торчит наружу. Люди ходят и ругаются в неопределённом поведении, тёть Люся скромная и молчит, а иногда мимо проходит Иван Васильевич и ругается он тоже не знает как себя вести тропинка заросла и всё равно не ходит там никто. Вскоре автобус удлинили ещё на три метра и опять пьяный водитель желает упихнуть свой девятиметровый автобус в пятиметровый гараж, уверенно почему то предполагая что он может это сделать тот насквозь таранит стену дежурного по отделению. Тот вызывает наряд и прерывает покатушки водителя. А водитель оказывается папой невесты дежурного, жена же водителя изменяет ему с районным судьёй а тот в свою очередь отец дежурного. Чем всё это закончится точно сказать нельзя. Так и у тебя.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LGH

Про не изменяемость глупость сказали.

Ну я догадывался, что всё бестолку вам чего-то объяснять. Впрочем, топик получился удачный, вон как у народа творчество попёрло, как упражняются в изысканном подтрунивании.

vodz ★★★★★
()
Ответ на: комментарий от LGH

Ну я понял так, что указатель, а это переменная, будет лежать на стеке и содержать в себе адрес на выделенную область памяти.

Да, будет. Но там её будет ровно на 5 элементов. А ты запихиваешь больше.

anonymous
()
Ответ на: комментарий от Begemoth

тролль может и знать.

однако - само срабатывание на определённом индексе и не меньше чем .

механизм такового явления каков?

qulinxao3 ★☆
()

Аллокатор выделяет страницами и ты можешь обращаться куда угодно в рамках выделенной памяти (в рамках страниц). Но как выйдешь за предел, то система скажет, что ничего такого не давала твоему приложению. Вот и всё.

kostyarin_ ★★
()
Ответ на: комментарий от Begemoth

код явно ub

однако вопрос не об ub _

вопрос о явлении постоянства индекса начиная с которого поведение отличается от меньшего и так же ловимого будь в переносимого ассемблера range check али ещё какой bound ….

так что вопрос ТС валиден генезису Си-языков - в отличии от Algol 60 в изводе Расsal-Modula-.. и т.п которые известно где . при том что на дистанции 1977-1985 ситуация была обратна ( ada тож)

почему поведение ошибочной программы отличается начиная с некоторого константного индекса - этот вопрос сродственен ориентации Си-комьюните - на машину как критерий.

qulinxao3 ★☆
()

Боже мой, ну когда вы уже научитесь читать книжки? И желательно профильные, а не переписку Энгельса с Каутским.

no-such-file ★★★★★
()
Ответ на: комментарий от vodz

А да, это они умеют. Могут после даже и жалобу подать. Смотрел видео на yоutube , где какой то линуксоид начинающий, чуть не плача спрашивает сам себя, почему Лор такой гнилой. Ему не понятно было почему в темах , вместо ответов зачастую оскарбление и почему те кто тебя оскорбляли ,на тебя же еще и жалобы подают.

Это не ко мне. Это парень с видеообращения. Лично мне Лор нравится. Тут как водворце: интриги, и тонны яда.

Ребята, еще раз: я люблю Лор, просьба на меня не писать доносы. Но вот начинающие от вас плачут.

Стоит ли этим гордится?

LGH
() автор топика
Ответ на: комментарий от LGH

Но вот начинающие от вас плачут.

Просто реально начинающих тут полтора в год. И местные просто не верят таким вопросам, считая что вам хочется просто поржать пока они честно подбирают слова.

Честный вопрос к вам - а что такое «выделена в статической области». Что такое «статическая область»? Сегмент кода. Сегмент данных. Сегмент стэка. Где лежит «статическая область» и как она там выделяется? Честно - первый раз слышу, правда интересно. Может и тут я уже всё проспал.

Toxo2 ★★★★
()
Ответ на: комментарий от Toxo2

Ну же говорил, что это только предположения. Не могу я заглянуть внутрь ПК. И формируются вот такие псевдознания путем откидивания всего противоречивого и взаимоисключающегопоэтому через какое то время приходится задавать вопросы, чтобы понять не далеко ли ушел от истины. Это непросто вопрос, чтобы лишь поговорить.

Вся память на мой взгляд, хоть и является всего лишь битовыми ячейками, которые могут использоваться для хранения нуля или единицы. Но операционная система может ее делить на динамическую, статическую и стековую. А может и не делить. Если делит, то статическую область она использует для данных, которые могут быть видны из других файлов или не видны, срок жизни этих данных будет отличен от срока жизни автоматических данных(переменных). Под данными, я понимал переменные в коде. Все переменные созданные в статической области будут глобальными. Если к ним применить static то область видимости будет ограничена. То есть если static модификотор был применен к локальной переменной, то она будет создана немна стеке, а в статисеской области памяти, если этот модификатор будет применен к глобальной переменной, то изменится тип линковки. Она может быть как внутренняя так и внешняя. Но сейчас мы о памяти. Вобщем Ос условно делит оперативу на такие области, которые кто то называет статической, автоматической и динамической. Думаю лучше отдельно создать эту тему. Тут многим есть что сказать. Уверен, что в стеке не все судари.

LGH
() автор топика
Ответ на: комментарий от LGH

http://stepanovpapers.com/canon.html#programming в конкретности Two textbooks by John Hennessy and David Patterson, Computer Organization and Design (introductory textbook), and Computer Architecture, A Quantitative Approach (graduate textbook) revolutionized the teaching and practice of computer architecture by training an entire generation to think systematically and quantitatively about computer architecture.

есть на русски. авторы верные речекряки. у каждого премия от Тьюринга с яблоком ( различать с Ньютоном)

qulinxao3 ★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.