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

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

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

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

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

Доброе время суток, господа! Кто нибудь знает, для чего в этом фрагменте кода используется "+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++
Подскажите что значит односвязный, двусвязный, линейный списки,. каков их шаблон, и как работает?

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

В чем смысл выражения "y+='A'-10" ? - C++
В чем смысл выражения y+='A'-10;

Каков смысл в "куче"? - C++
Всем привет! Прогуглил все вдоль и поперек, прочитал достаточно инфы, но так и не понял где, как и зачем мне может понадобиться...

Наследование: "БГТУ", "Факультет", "Группа", "Подгруппа" - C++
Определить иерархию классов (в соответствии с вариантом – выделить базовый и производные). Реализовать классы (самостоятельно задать...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Бендерродригез
Сгибальщик
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
03.08.2013, 20:39     Смысл "+1" #2
Место под нулевой символ, дабы была строка, а не массив символов.
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
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
5416 / 4812 / 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
5416 / 4812 / 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
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
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
5416 / 4812 / 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++
Выполните задания с использованием библиотечного класса string. Даны строка S. Необходимо после каждого знака препинания (".", ",",...

С++ консольное приложение win32, матерится на первое "pow" после "if", а на "system" говорит что неопределён. - C++
#define _CRT_SECURE_NO_WARNINGS #include "stdafx.h" #include <math.h> #include <iostream> #define Pi 3.1416 #include <clocale>...

Написать функцию поиска человека по полю "фамилия" в массиве структур "Note" ("Персональная информация") - C++
Вывести из структуры информацию о человеке, чья фамилия введена с клавиатуры #include <iostream> #include <locale> #include...


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

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

Не по теме:

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

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

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