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

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

Восстановить пароль Регистрация
 
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
03.08.2013, 20:38     Смысл "+1" #1
Доброе время суток, господа! Кто нибудь знает, для чего в этом фрагменте кода используется "+1"?
C++ (Qt)
1
itsString = new char [itsLen+1];
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2013, 20:38     Смысл "+1"
Посмотрите здесь:

C++ по строкам.замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно
C++ Создать класс комплексных чисел и ввести операции: "+", "-", "*", "/".
В чем смысл выражения "y+='A'-10" ? C++
Чтения структуры из файла (описать структуру с именем "ORDER": "счет плательщика"; "счет получателя"; "сумма, переводится банковской операцией") C++
Объясните смысл задачи "3 конвейера" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
03.08.2013, 20:39     Смысл "+1" #2
Место под нулевой символ, дабы была строка, а не массив символов.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
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
5282 / 4801 / 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
5282 / 4801 / 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,221
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
5282 / 4801 / 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++
Не могу понять смысл "связные списки" C++
Структура «Преподаватель» с полями "ФИО", "стаж", "категория", "нагрузка" C++

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

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

Не по теме:

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

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

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