Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
#1

Смысл "+1" - C++

03.08.2013, 20:38. Просмотров 540. Ответов 12
Метки нет (Все метки)

Доброе время суток, господа! Кто нибудь знает, для чего в этом фрагменте кода используется "+1"?
C++ (Qt)
1
itsString = new char [itsLen+1];
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
03.08.2013, 20:39     Смысл "+1" #2
Место под нулевой символ, дабы была строка, а не массив символов.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
03.08.2013, 20:52     Смысл "+1" #3
оо.. знакомый код, если ты учил массивы, то должен знать, что если у тебя массив massiv[100] то последний элемент в массиве у тебя massiv[99], а massiv[100] это уже выходит за область видимости массива, и изменяет параметры какой-то другой программы, что может закончиться печально, в том числе для твоей ОС.

после строчки:
C++
1
itsString = new char [itsLen+1];
у тебя должна идти строчка
C++
1
itsString[itsLen] = '\0';
если бы не было [itsLen+1], то твой массив вышел бы за область видимости.
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.08.2013, 20:53     Смысл "+1" #4
Если предположить, что itsLen - это количество символов в строке (без символа конца строки '\0'), то для выделения памяти под такую строку, нужно выделить на 1 элемент больше, чтобы туда поместился и '\0'.
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
03.08.2013, 20:57  [ТС]     Смысл "+1" #5
Цитата Сообщение от VLK Посмотреть сообщение
оо.. знакомый код, если ты учил массивы, то должен знать, что если у тебя массив massiv[100] то последний элемент в массиве у тебя massiv[99], а massiv[100] это уже выходит за область видимости массива, и изменяет параметры какой-то другой программы, что может закончиться печально, в том числе для твоей ОС.

после строчки:
C++
1
itsString = new char [itsLen+1];
у тебя должна идти строчка
C++
1
itsString[itsLen] = '\0';
если бы не было [itsLen+1], то твой массив вышел бы за область видимости.
VLK, скажите, пожалуйста, почему именно такой тип записи?
C++
1
itsString[itsLen] = '\0';
Почему не такой? Изначально, itsLen = 11. Значит нулевой символ должен быть на позиции 12-ой позиции.
C++
1
itsString[itsLen+1] = '\0';
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.08.2013, 21:04     Смысл "+1" #6
Цитата Сообщение от Erjay Посмотреть сообщение
Значит нулевой символ должен быть на позиции 12-ой позиции.
Индексы начинаются с 0. Массив из 12 элементов, индексы: 0 - 11.

Добавлено через 3 минуты
Ручная запись '\0' в конец массива не всегда нужна, зависит от способа копирования в него строки. Стандартные функции копирования (например, strcpy()) сами это делают, главное, чтобы под него было место.
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
03.08.2013, 21:05  [ТС]     Смысл "+1" #7
11-ая позиция, хорошо. Но, почему, не такой тип записи?
C++ (Qt)
1
itsString[itsLen+1] = '\0';
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
03.08.2013, 21:10     Смысл "+1" #8
Цитата Сообщение от Erjay Посмотреть сообщение
Почему не такой?
потому что все закончится печально

Если ты создал динамический массив и выделил под него память, а именно это сделано в этой строчке:
C++
1
itsString = new char [itsLen+1];
т.е. допустим itsLen = 100, в итоге эта строчка превращается у тебя в:
C++
1
itsString = new char [100+1];
а потом:
C++
1
itsString = new char [101];
то это 101 нельзя изменить (нет может быть можно но, тебе пока рано лезть в эти манипуляции)

а запись:
C++
1
itsString[itsLen+1] = '\0';
будет иметь вид:
C++
1
itsString[101+1] = '\0';
а потом:
C++
1
itsString[102] = '\0';
но массив то имеет 101 элемент, а ты пытаешься в 102 элемент записать что то (в элемент, который не существует), тут даже 101 не существует (т.к. массив начинается с 0, а не с 1).

Еще для понимания:

C++
1
itsString = new char [itsLen+1];
это создание и выделение памяти под массив, а
C++
1
itsString[itsLen+1] = '\0';
это запись в массив, в элемент номер itsLen+1 значения '\0'

точно так же как:

C++
1
2
int var; // аналог itsString = new char [itsLen+1]
var = 5; // аналог itsString[itsLen+1] = '\0'
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.08.2013, 21:26     Смысл "+1" #9
Цитата Сообщение от Erjay Посмотреть сообщение
11-ая позиция, хорошо. Но, почему, не такой тип записи?
C++ (Qt)
1
itsString[itsLen+1] = '\0';
Потому что
Цитата Сообщение от Erjay Посмотреть сообщение
Изначально, itsLen = 11.
11 + 1 = 12, itsString[12] = '\0' - выход за границу массива.
Kastaneda
03.08.2013, 22:10
  #10

Не по теме:

Цитата Сообщение от VLK Посмотреть сообщение
и изменяет параметры какой-то другой программы, что может закончиться печально, в том числе для твоей ОС.
VLK, ты под real mode программируешь?

VLK
03.08.2013, 22:12
  #11

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
VLK, ты под real mode программируешь?
Ой.. я пока такое программирую что стыдно показать..

Kastaneda
03.08.2013, 22:17
  #12

Не по теме:

Перефразирую вопрос - под ДОС пишешь? Потому что под любую современную ОС твое утверждение (которое я процитировал в предыдущем посте) не верно. В 32 битной ОС процессу доступно 4ГБ виртульного адресного пространства (теоретически, практически меньше) и максимум, что можно испорить выходом за границу массива - это свой же стек или залезть в куче на свои же данные.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2013, 22:22     Смысл "+1"
Еще ссылки по теме:

Результаты денежной лотереи подано таблицей выигрышных номеров "А" и таблицей выигрышей в гривне "С", где с (и C++
Class "IEntity" не содержит члена "m_pEntityId" C++
Несовместимые типы операндов ("HKL" и "int") C++
C++ Ошибка усечение из "double" к "float"
C++ Ошибки "system" is ambiguous и identifier "_getch" is undefined

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

Или воспользуйтесь поиском по форуму:
VLK
03.08.2013, 22:22     Смысл "+1"
  #13

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
Перефразирую вопрос - под ДОС пишешь? Потому что под любую современную ОС твое утверждение (которое я процитировал в предыдущем посте) не верно. В 32 битной ОС процессу доступно 4ГБ виртульного адресного пространства (теоретически, практически меньше) и максимум, что можно испорить выходом за границу массива - это свой же стек или залезть в куче на свои же данные.
Я пишу пока что программы из учебника, Дейтела и то еще пока не все, по поводу попасть или не попасть, пускай лучше боится попасть и проверяет эти массивы 3 раза, чем потом в многотонном коде ошибку ищет, там же не будет ему писать что он вышел за область массива, да и еще какого именно массива.

Yandex
Объявления
03.08.2013, 22:22     Смысл "+1"
Ответ Создать тему
Опции темы

Текущее время: 23:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru