С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Есть ли смысл "клеить" проект из кодов готового приложения? - C++
Итак суть вопроса: Есть ГОТОВЫЕ коды проекта. ( но в *.ТХТ файлах) Получиться ли склеить их вместе и получить качественное ПО? ...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс "вентилятор" содержащий в себе классы:...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

12
Бендерродригез
Сгибальщик
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
03.08.2013, 20:39 #2
Место под нулевой символ, дабы была строка, а не массив символов.
1
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
03.08.2013, 20:52 #3
оо.. знакомый код, если ты учил массивы, то должен знать, что если у тебя массив massiv[100] то последний элемент в массиве у тебя massiv[99], а massiv[100] это уже выходит за область видимости массива, и изменяет параметры какой-то другой программы, что может закончиться печально, в том числе для твоей ОС.

после строчки:
C++
1
itsString = new char [itsLen+1];
у тебя должна идти строчка
C++
1
itsString[itsLen] = '\0';
если бы не было [itsLen+1], то твой массив вышел бы за область видимости.
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.08.2013, 20:53 #4
Если предположить, что itsLen - это количество символов в строке (без символа конца строки '\0'), то для выделения памяти под такую строку, нужно выделить на 1 элемент больше, чтобы туда поместился и '\0'.
1
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
03.08.2013, 20:57  [ТС] #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';
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.08.2013, 21:04 #6
Цитата Сообщение от Erjay Посмотреть сообщение
Значит нулевой символ должен быть на позиции 12-ой позиции.
Индексы начинаются с 0. Массив из 12 элементов, индексы: 0 - 11.

Добавлено через 3 минуты
Ручная запись '\0' в конец массива не всегда нужна, зависит от способа копирования в него строки. Стандартные функции копирования (например, strcpy()) сами это делают, главное, чтобы под него было место.
1
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
03.08.2013, 21:05  [ТС] #7
11-ая позиция, хорошо. Но, почему, не такой тип записи?
C++ (Qt)
1
itsString[itsLen+1] = '\0';
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
03.08.2013, 21:10 #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'
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.08.2013, 21:26 #9
Цитата Сообщение от Erjay Посмотреть сообщение
11-ая позиция, хорошо. Но, почему, не такой тип записи?
C++ (Qt)
1
itsString[itsLen+1] = '\0';
Потому что
Цитата Сообщение от Erjay Посмотреть сообщение
Изначально, itsLen = 11.
11 + 1 = 12, itsString[12] = '\0' - выход за границу массива.
1
Kastaneda
03.08.2013, 22:10
  #10

Не по теме:

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

0
VLK
03.08.2013, 22:12
  #11

Не по теме:

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

0
Kastaneda
03.08.2013, 22:17
  #12

Не по теме:

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

0
VLK
03.08.2013, 22:22     Смысл "+1"
  #13

Не по теме:

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

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

Не могу понять смысл "связные списки" - C++
Подскажите что значит односвязный, двусвязный, линейный списки,. каков их шаблон, и как работает?

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата" - C++
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в программе ввести в массив данные и...

Объясните смысл задачи "3 конвейера" - C++
Никак не могу понять, что такого сложного в следующей задаче, которая в книге помечена звездочкой(т.е. является задачей повышенной...

по строкам.замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно - C++
замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно Добавлено через 21 час 4 минуты неужели никто не знает...


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

Или воспользуйтесь поиском по форуму:
13
03.08.2013, 22:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.