LINUX.ORG.RU

Массив

 


2

1

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

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

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

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

}


Ответ на: комментарий от RedEyedMan666

Это в С++ всё так сложно с указателями или просто топикстартер наговнокодил?

ТС - умеренной толстоты тролль.

Serral
()
Ответ на: комментарий от RedEyedMan666

Насколько я понял, он выделил память только под 5 элементов и пытается туда еще что-то записать?) Бгг.

Его первая же строка палит - «main(){». Он явно знает С, а значит не делал бы таких глупых ошибок.

Serral
()
Ответ на: комментарий от RedEyedMan666

Меня немного удивило, что не указан тип функции, например, int, или void, если функция ничего не возвращает.

Наследие древних сишных времен, тогда, если тип не указывался, то все считалось за int.

Serral
()
Ответ на: комментарий от RedEyedMan666

Разве в Си числа начинаются не с нуля? Или можно с единицы начать?

Индексы начинаются с нуля, кол-во элементов пять, последний индекс - 4.

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

Его первая же строка палит - «main(){». Он явно знает С, а значит не делал бы таких глупых ошибок.

Чего?

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

Чего?

Любой начинающий, который не вникает, а бездумно копипастит хэллоуворлды, будет писать «int main». Другого он просто не увидит, если только не ограбит музей. Это во-первых, во-вторых, если бы он опять же копипастил примеры (из которых подсмотрел new int[5]), то и дергал бы элементы через a[6] и т.п., а не изображал бы арифметику указателей с разыменовыванием.

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

Любой начинающий, который не вникает, а бездумно копипастит хэллоуворлды, будет писать «int main»

Бред

main – In C89, the unspecified return type defaults to int. So, main is equivalent to int main in C89. But in C99, this is not allowed and thus one must use int main.

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

Бред

Окей, найди учебник для С++, где в примерах будет так написано. Ну или примеры на SO или в другом месте. Это же легко должно быть?

main – In C89, the unspecified return type defaults to int. So, main is equivalent to int main in C89. But in C99, this is not allowed and thus one must use int main.

Во-первых я это уже писал. Во-вторых у ТС С++, если ты и это тоже не заметил.

Serral
()
Ответ на: комментарий от RedEyedMan666

почему не *(A+10)=&5555; ?

Потому-что 5555 не lvalue и у него нельзя взять адрес, а ‘a’ - массив целых чисел, а не указателей на целые числа.

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

Ну или примеры на SO

Причём тут это, детектив?

Любой начинающий, который не вникает, а бездумно копипастит хэллоуворлды, будет писать «int main»

Ты так говоришь, что не поставленный int в этом месте - это проявление какого-то проффесионализма

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

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

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

Нет. Все эти понятия из разных плоскостей. Динамическое выделение памяти - это запрос вашей программы к ОС. Вы просите ОС дать вам кусок памяти и сообщить её адрес. Может дать, а может не дать. Как именно ОС вам даст - вас не касается. Просил прораба найти 100 кирпичей - вон в той куче их точно есть. Может быть там их 200 валяются, но только 100 - твои, прорабу виднее. Тут ОС вам как прораб.

«Статическая» - это вообще слишком высокоуровневая абстракция. Это ваша просьба компилятору иметь в виду, что вот эти ячейки памяти вы собираетесь где-нибудь когда-нибудь переиспользовать вне обычной «области видимости» (еще одна высокоуровневая абстракция). Опять же тонкости реализации могут скрыты, как именно компилятор вывернется чтобы вам угодить - это его компиляторская проблема. Когда-то мне нравилось самому такие вещи решать. Выделять некоторое количество байт в .DATA и самому, руками туда складывать по необходимости разное. И самому же помнить как интерпретировать данные там. Честно - не знаю почему сейчас это считается абсолютным и бесспорным злом.

«Стековая» - это такой карман «первый пришел - последний ушел». Честно - большую часть жизни думал, что стек нужен в основном для передачи параметров в функции, возврата значений (рекурсия именно так и кушает ваш стек) и быстрого перемещения значений между регистрами. Когда открыл для себя массивы на стеке долго удивлялся использованию его не по прямому назначению.

Как-то так.

Это непросто вопрос, чтобы лишь поговорить.

Да бросьте. Сужу по себе, но за «поговорить» рядом с настоящими умными людьми сюда и ходят такие как мы с вами. Тут много умных. Лучше их читать молча, конечно. Но иногда прёт.

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

Причём тут это, детектив?

При том, что ТС сам писал этот пример, а не копипастил готовое.

Ты так говоришь, что не поставленный int в этом месте - это проявление какого-то проффесионализма

Это проявление опыта работы с С до того, как он решил создать топик, где попытался изобразить корявый код новичка на С++.

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

Это проявление опыта работы с С до того, как он решил создать топик, где попытался изобразить корявый код новичка на С++.

Никакого тут опыта нет.

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

Это пример. Просто чтобы выделить то, что хотелось бы рассмотреть.

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

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

Да это то понятно.

Но любой опытный разработчик автоматически int поставил бы, потому что иначе — это бессмысленное искание приключений себе на попу.

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

Ты тоже не понял чувак эту тему.... я могу только объяснить тебе словами девушки с форума. Она эту тему как раз и развивала.

Вот так мы объявили указатель
int *A;
Если сделаю сейчас вот так
*A;
То разыменую, его. 
еще раз, смотри, как она объясняла...
int r=11;//создали переменную 
int *A=&r;// взяли ее адрес и поместили в "А".

Теперь когда я сделаю вот так
*А  то буду уже иметь дело с переменной "r" . 
Если сделаю во так
*А=666;
 То в переменной r окажется значение 666.

Теперь она говорила так, 
*(А) ты ее разыменовываешь и значит знак амперсанта, то есть взятия адреса тут лишний. Потому что ты будешь иметь при разыменовывании дело не с указателем, а с переменной, адрес которой содержал указатель.

Так говорила девушка.



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

Но любой опытный разработчик автоматически int поставил бы, потому что иначе — это бессмысленное искание приключений себе на попу.

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

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

Я не поговорить захожу сюда. Захожу что бы пролили свет на области Линукс и области программирования. Тут есть кто шарит прям очень. Ну есть и придурки, и это еще мягко сказанно.

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

тех же речекряков есть интро на русском. вторая возможно.

твой русский хуже твоего мыслительного на который ты можешь при чтение английского . так что уткачи.

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

особая прелесть трудностей в указатели у многих несознающих себя под саморефлексодебагом

что x=x семантика lvalue и rvalue различна

в каком-то языке 1968+- имя было всегда адрессом а значением переменной по имени было .имя

и тогда вместо x=x

x=.x

ассемблер сплошной

ну и тогда индексование

.x+i

если . вяжет слабее +

но тогда инкримент

x=(.x)+1

qulinxao3 ★★
()

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

Наверное вам уже многократно подсказали …
Если в корзину можно положить только 5 яблок, то как можно в нее положить двадцать яблок или взять двадцатое яблоко?
Впрочем если корзина «умная», то можно.

Владимир

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

Вот «ругают» все Метапрога, а если бы их «трешка» была, то этот бы форум посещали «Метапроги» всей земли.

Просьба к "тупым критиканам ни чего не понимающих в разработке графического языка программирования" - НЕ ПЕРЕУСЕРДСТВУЙТЕ.

Владимир

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

И эшо.

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

PS: К сожалению @metaprog уж очень похож на Чеховского врача …

Владимир

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

Теперь понятно. Спасибо.

Если поймете мощь: void, * и &, то C/C++ для вас станет языком N1 для системных разработок /иронии нет/.

Владимир

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

то C/C++ для вас станет языком N1 для системных разработок

Мне для себя. Писать плюсовый код для игры (игровой движок). Врядли я когда-либо возьмусь писать что-либо серьезное. А так я все свои питоноскрипты для игры перепишу на С++ со временем. В теории у меня будут как утечки и сегфолты, так и относительно хорошая производительность и экономия оперативной памяти.

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

О графическом языке программирования.

Посылаю голову пеплом и рыдаю.  
Зачем я дурья башка такой тред спугнул.  
Простите братья за мою глупость.

Владимир

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

А так я все свои питоноскрипты для игры перепишу на С++ со временем.

Тогда сразу совет - забудь про «мощь: void, * и &» (с). Современный С++ позволяет в большинстве случаев обходится без сырых указателей, и тем более type erasure.

Serral
()
Ответ на: комментарий от RedEyedMan666

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

Погуглите «habr освобождение памяти PVS Studio».

Владимир

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

Эшо.

О графическом языке программирования.

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

Владимир

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

Современный С++ позволяет в большинстве случаев обходится без сырых указателей, и тем более type erasure.

Можете объяснить, почему указатели сырые? и что такое type erasure?

RedEyedMan666
()
Ответ на: комментарий от Serral

Тогда сразу совет - забудь про «мощь: void, * и &» (с).

Скорее это предостережение … Разрабатываю метадата базу.
Далее не много утрирую.
Так вот «void, * и &» это ее «родычи до пятого поколения».

Владимир

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

Поздравляю всех!
Ураааааааааааааааааааааааааааааааааааааааааааааа!

Метапрог-прототип, версия 7 + графические диалоги на Метапроге Метапрог-прототип, версия 7 + графические диалоги на Метапроге

PS: Вообще то @meatprog не глупый парень.
Когда-то он поймет, что «касторка» неэффективна для лечения «головной боли».

Владимир

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

Что именно не понял? Указатели нужно знать, как отче наш. Это очень Сильный инструмент.

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

Про void скажите пожалуйста…. в чем особенность? Может так друг у друга, научиться можно. Там немого услышал, здесь. И может сложится пазл

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

Да всё не понял. Ко мне понимание приходит только на практике, когда сам пишешь код, сам делаешь ошибки и сам в них разбираешься. Сколько читал книжек, того же Страуструпа или K&R, но так ничего и не понял. Есть только некоторое поверхностное понимание, но нет глубокого, когда чувствуешь язык.

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

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

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

int a=11;
int b=12;

int *A;
A=&a;
A=&b;
//видишь, мы используем указатель, также, как и оюычную переменную. Да это и есть переменная, только определенного типа.

Вот смотри:
char s; //  s может содержать только символы. 


int j; //в переменной такого типа хранится могут лишь целые числа.


*A// В переменной же такого типа адреса.
То есть указатель это всего лишь переменная, которая содержит в себе адрес.
Переменная s может содержать в себе символ, переменная j может содержать в себе целое число, а переменная A содержит в себе адрес. Но не просто адрес, а адрес ячейки памяти.

Так устроена память, что наименьшая адресуемая ячейка памяти, это байт. И этот байт имеет адрес, в шестнадцатиричной системе исчисления. И вот когда мы создаем переменные, и присваевываем им значения
int a=999;
То мы не в "а" буквально запихали 999, как телефон в чехол, нет мы 999 поместили в ячейку памитя. Но в какую именно? Чтобы ее знать и найти имя ей дали "a". Ну у нас же у всех были в детстве погоняла? Ну как клички... мама нас назвала , например Вовочкой, а кличка у него толстый. Так вот для компьютера "а" это кличка , которую вы дали переменной, настоящее ее имя это адрес в шестнадцатиричной системе счисления.  Папа же вовчика дома зовет вовчиком, а не толстым, так вот компьютер это папа. И он зовет все переменные настоящими именами, которые он дал, а не ты, ту кличку, когда создавал переменную.  И когда он будет искать тот байт, в которой мы что то подожили, он спросит-" вовчик, ты где?" Не толстый ты где, а вовчик, ты где. То есть настоящим именем воспользуется, адресом в шестнадцатиричной системе.

Вот указатели и созданны для этих адресов.

Теперь представь ты новый трудовик в школе, у тебя первый день. Заходишь ты в класс, а там всем друг друга по кличкам зовут, ну ученики так умеют. А тебе нужны их истинные имена,чтобы отметить в журнале. Что делать?

Для этого есть амперсант &.  У него несколько назначений.
Вот его первое: он берет кличку и превращает ее в истинное имя, то есть в адрес.
*A=&a;
Берется кличка толстый, и изнается по ней настоящее имя. Это вовчик, и оно помещается в указатель.

Так объясняли на форуме, какая то девушка.

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