| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > как соединить char x[j] + char y[i] ??? |
| Автор: Syberex 29.3.2007, 14:55 | ||
в общем есть такое
как мне соединить их вместе? чтоб было hhhhhhhhhjjjjjjjj, т.е соединить и данные занести либо в char[ i],т.е заранее определённого рамера , либо динамически new x[y]; как? |
| Автор: Partizan 29.3.2007, 15:01 | ||
|
| Автор: JackYF 29.3.2007, 15:02 | ||
мдя. Ну несколько раз уже было:
А вообще не 50 и 80, а константы нужно указывать |
| Автор: Syberex 29.3.2007, 15:11 |
| супер, всё работает, сенкс |
| Автор: JAnty 29.3.2007, 15:11 | ||
c=hhhhhhhhhjjjjjjjj |
| Автор: Partizan 29.3.2007, 15:16 | ||||
неправильный ваш код... ибо вполне вероятно что в итоге такой операции мы получим переполнение в char a[50] |
| Автор: Goryachev 29.3.2007, 15:33 |
| JAnty, в этом случае может нет side effects , но будет случай, в котором прога вылетит. |
| Автор: Dov 29.3.2007, 15:35 | ||
В данном случае, по-моему, вообще ничего не нужно указывать, равно как и заморачиваться с динамическим массивом. Просто нужно объявить массив размером a + b и всё. Так, например:
Ну, или что-то в этом роде. |
| Автор: Fazil6 29.3.2007, 17:01 |
и на основании чего ты сделал такой вывод? |
| Автор: Dov 29.3.2007, 17:05 |
| JAnty, уже здесь ты вышел за пределы массива, а твой компилятор об этом даже не догадался |
| Автор: apook 29.3.2007, 17:13 | ||||
никто не вышел |
| Автор: Dov 29.3.2007, 17:20 |
apook, |
| Автор: JAnty 29.3.2007, 17:22 | ||||
Теоретически. Конец строки добавляется сам после массива. В Билдере написал:
Даже варнинга небыло. |
| Автор: Partizan 29.3.2007, 17:30 |
| JAnty, тебе просто повезло) |
| Автор: JAnty 29.3.2007, 17:40 |
| 10 раз откомпилил, 10 повезло. Вот она удача -> |
| Автор: Partizan 29.3.2007, 17:44 |
| тебе повезло что программа не вылетела с access violation при попытке записи за границы массива.... |
| Автор: Kuvaldis 29.3.2007, 17:45 |
| JAnty, Запусти прогу не из IDE, а из проводника. Думаю, что теперь увидишь разницу (скорее всего, ты еще и debug версию компилишь) |
| Автор: apook 29.3.2007, 17:45 | ||||
a[2]='\0'; все правильно Dov я не хулиганю эта обьявление правильное на мой взгляд
чему равна длина этого массива? Только не надо говорить про плохие компиляторы |
| Автор: JackYF 29.3.2007, 17:54 |
выход за границы массива. ты имеешь доступ к a[0] и a[1]. У тебя размер - 2 элемента, а не 3. |
| Автор: JAnty 29.3.2007, 18:03 | ||
| char a[2]; a[0]='a'; a[1]='q'; a[2]='w'; a[3]='e'; a[4]='t'; Forma->Caption=a;
Пожилание учол, откомпилил финальную в ехе и запустил на другом компе, и всё mrOk; |
| Автор: Partizan 29.3.2007, 18:09 |
| ггг ) попробуй текст в 10 Мбайт дозаписать) может тогда наконец вылетит) |
| Автор: vinter 29.3.2007, 18:14 | ||||
везение и больше ничего, даже скорее невезение, потомучто когданить из-за этого на такую проблему можешь попасть.. почитай про устройство памяти и про определение переменных и про то как все это хранится, и nujulf поймешь в чем ты неправ
так тут как раз два элемента будет \0 и \0. \ - экранирующий символ что правильно, то что ты обьявил массив из 2 элементов, а обращаешься к третьему? |
| Автор: JAnty 29.3.2007, 18:22 | ||
Я же не собираюсь так и понатуре делать, память просто терпит, винда допускает оплошности, но суть бредовая, согласен. По сути дело оно как, в памяти пишутся символы по порядку и потом \0 . потом читаем до \0, в указателе мы же не указываем длинну, а a[2]='\0' запишет символ \0 после символа a[1] в памяти. |
| Автор: vinter 29.3.2007, 18:28 | ||
но так не должно позволять делать! хм.. у меня подозрение что здесь замешан борланд.. Добавлено через 2 минуты и 16 секунд |
| Автор: apook 29.3.2007, 18:38 | ||||
char str[ 2 ]="\0"; что здесь опасного просто строка длинной 0, зачем экранирование экранируется '\n'
но он же там будет но кстати плохо однако он затереться может (а может и нет |
| Автор: JAnty 29.3.2007, 18:45 | ||
Там так называемая "защита от дурака" Именно так делается изменение массивов и т.д. в стандартных библиотеках. А теперь это доступно пользователю в ручную. Превратим a[2] в a[3];
С этим надо быть осторожным. А лучше преобразовывать стандартными методами, которые делаются именно таким способом, но которые проверены годами и стандартом С. ИМХО Добавлено через 5 минут и 35 секунд Шалости с ОЗУ. |
| Автор: vinter 29.3.2007, 18:53 |
а если сразу после массива идет нужная информация?? например другая строка, к чему тогда такие шалости могут привести? это какими это? лучше динамически выделять, и не иметь проблем с памятью.. |
| Автор: JAnty 29.3.2007, 18:59 | ||||
Тогда разумеется это чревато полным пипецом. Добавлено через 7 минут и 59 секунд
А тогда кагже работает указатель на строку, адрес не меняется, но строка растёт? а? |
| Автор: apook 29.3.2007, 19:15 | ||
|
| Автор: vinter 29.3.2007, 19:20 | ||
указатель это всего лишь адрес, а ф-ии вывода выводят все начиная с того на что указывает указатель, до '\0' apook , это ты к чему?? |
| Автор: JAnty 29.3.2007, 19:36 | ||
Адрес не маняется. Допустим у нас в строке 5 символов (5 ячеек в памяти + \0) а с 7 ячейки другая инфа, а мы взять, да изменили нашу строку до 35 символов, как оно сработает? |
| Автор: apook 29.3.2007, 19:36 | ||||
Что-то навеяло, к вопросу о нуль символах и тем что за ним а вообще это способ использовать память которая зря пустует
и как-же ты собрался менять размер статического массива? с динамическим то это не так просто |
| Автор: vinter 29.3.2007, 19:39 |
неопределено не надо так, зря ниче не пустует, а вот гемморой всегда на стреме |
| Автор: apook 29.3.2007, 19:45 | ||
Все отлично память пустует зря ведь она отведена под массив из 50 символов тогда как занято 9 остальная allocate, да и гемороя не так много разве что маленько |
| Автор: Partizan 29.3.2007, 19:48 |
| =) ну вот забил ты в большом проекте эту "пустующую память" важными данными... и через какоето время благополучно забыл об этом) и думаешь...хммм...а чего она пустует...дайка я туда запишу чонить) и пожалуйста) вот он и геморрой))) геморройчик) |
| Автор: JAnty 29.3.2007, 20:03 | ||
Так значит можно. А я собрался менять *стр /*не массив*/, она же увеличивается не смотря на то, чо там дальше в памяти. |
| Автор: apook 29.3.2007, 20:05 |
| Partizan Ну вот выделил ты динамическую память через new забил ее важными данными забыл об этом и удалил через delete только не спрашивай зачем забывать |
| Автор: Partizan 29.3.2007, 20:14 |
| apook, причём тут динамическая память) речь ведь шла о предложенном тобой методе использования "простаивающей" памяти) |
| Автор: zkv 30.3.2007, 18:27 | ||
| apook, JAnty, на практике, самое ценное в проге, это даные пользователя, а уж потом экономия оперативки и прочее. С вашим подходом вы можете не только программу уронить, но и (что в большинстве случаев хуже) эти данные подпортить, и неизвестно, когда это всплывет, и как весело потом будет искать ошибку Можно представить, как в какой нибудь проге расчета зарплаты, "случайно" изменится повышающий коэффициент в меньшую сторону, пожалуй это будет справедливо, только если зарплата в этот момент будет рассчитываться для создателя этой программы Вот вам примерчик использования "пустующей памяти":
хм... мой пример компилится безо всяких замечаний. |
| Автор: apook 30.3.2007, 18:44 | ||
Что за такой не хороший подход, я ведь не настаиваю что это есть способ которым желательно пользоваться, это вообще не способ я просто к слову сказал просто показать что такое возможно точнее если я уверен что элеметы массива существуют то обращаться к ним необычно на первый взгляд наример str[ -20 ] как я показал в примере разумеется в ответствеенных участках прогр лучше пользоваться стандартными методами ну разве-что иногда... |
| Автор: vinter 30.3.2007, 18:56 |
действительно...странно, а в том примере, у меня писало overflow |