![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
IKM2007 |
|
||||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
Почему на экране появляется более 30-и символов
,если я копирую в массив a 17 символов? Заранее, Спасибо. -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
||||
|
|||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Потому что ф-ция, в случае неумещения в рамки не добавляет trailing zero. На сайте, который я тебе дал вчера, об этом должно быть написано ;).
Нужно так:
Т.е. явно убеждаться, обнулять последний элемент массива. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
archimed7592, а почему при cout<<a; печатается окончательное число символов, если нет завершающего символа?
![]() И вообще, откуда эти символы беруться??? Это сообщение отредактировал(а) IKM2007 - 10.5.2008, 11:58 -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Я не archimed7592, но отвечу =)
Операторы << и >> перегружены для char*, и поэтому такое нармально вводится -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
bronislav, можно поподробней.
-------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
Потому, что в С/С++ признаком конца строки является символ '\0'. При выделении памяти под массив, эта память, в твоём случае, заполняется мусором и когда ты посылаешь данные, расположенные по этому адресу в памяти, на печать в консоль поток вывода печатает все данные, пока не встретит символ '\0'. Теоретически, он может напечатать и миллион ненужных тебе символов, пока встретит символ конца строки. В твоём случае, после "12345678912345678¤¤¤¤▌▌▌▌▌▌▌▌▌▌▌q" в массива оказался нулевой байт и печать прекратилась.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 2 Всего: 207 |
из области памяти с начальным адресом a + 17 если брать имплементацию аллокатора в GCC, то по этому адресу скорее всего будет находится блок метаинформации о ранее выделенном блоке памяти -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
W4FhLF, Спасибо за исчерпивающий ответ, Премного блогадарен!
![]() Добавлено через 4 минуты и 44 секунды MAKCim, я вообще то пользуюс Visual C++, так что не знаю
но все равно пасиб ![]() -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
IKM2007, может обратишь уже свой взор в сторону прикреплённой темы http://forum.vingrad.ru/index.php?show_typ...showtopic=60932 ?
![]() -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
lp_sun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 17.12.2007 Репутация: нет Всего: нет |
ребят, помоги заодно и мне вкурить такую фишку:
если msg_size=1023 или 1025 или другие значения то все копируется нормально и в b в результате получаем наше значение, но если в msg_size записать 1024 то в b будет 0. Я так понимаю это связано с тем что под 1024 какой то управляющий символ и strncpy поэтому работает некорректно????? объясните плиз и тогда подскажите эквивалент какой нить этой функции шоб она просто по указателям опредеоенные блоки памяти копировала |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
lp_sun, во-первых, это зависит от того, чем pntr_shm инициализирован.
Во-вторых, это зависит от endianness - порядка байт в машинном слове. К примеру, если msg_size=2048, то скорее всего тоже будет b=0. Объясняется это так. Если разбить 1024 на байты, то получится следующее: 00 00 04 00. Если записать это дело задом наперёд(как это, скорее всего, хранится в памяти твоего компьютера), то получим 00 04 00 00 - как видишь первым байтом(читай первым символом в строке) будет ноль, а ноль - это признак конца строки, откуда strncpy делает вывод о том, что далее копировать не нужно. Если, разбить 1025 на байты, то получим 00 00 04 01, что задом наперёд будет 01 04 00 00 - т.е. первые два байта будут скопированны, остальные нет(но они и так нули). Аналогично 1023: 00 00 03 FF -> FF 03 00 00. Какой вывод нужно сделать? Такой, что ф-ции str*** предназначены для работы со строками и ни с чем иным. Для работы с raw памятью имеются, к примеру ф-ции mem***. Добавлено через 50 секунд
memcpy -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
lp_sun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 17.12.2007 Репутация: нет Всего: нет |
archimed7592, благодарю за развернутый ответ
![]() Это сообщение отредактировал(а) lp_sun - 11.5.2008, 00:38 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |