C/C++
Может ли в С++ произойти переполнение строки как например переполнение инта? То есть может ли обычный стринг не уместить
Если строка представляет из себя массив символов (char[]), то да. Попытка записи по индексу, выходящему за пределы границ такого массива (т. е. за длину строки), изменит значение байта, не принадлежащего этой строке, ввиду того, что массив по сути своей является указателем на первый свой элемент, из-за чего к нему применимы все свойства указателей, что и есть переполнение.
Если вы имеете ввиду стандартный поток ввода в среде Windows, то вполне может. Буфер под входящую строку консоли Windows ограничен размером в 8 КБ или 8192 байта. Таким образом в однобайтовой кодировке вы можете ввести только 8191 символ, ещё один требуется под 0-терминатор. Если же вы используете два байта под каждый символ, то отведённый размер вам придётся делить пополам. Таким образом ваша строка сократится до 4095 символов. Всё что не сможет войти будет обрезано. Такое поведение не зависит от типа данных. Это свойство консоли cmd.exe
Ограничения на статический массив типа char[] ещё строже. Это связано с тем, что программный стек ограничен 2 МБ и может произойти так, что под массив в стеке не хватит места. Например, такой код, который содержит большой массив строк
https://learn.microsoft.com/ru-ru/troubleshoot/windows-client/shell-experience/command-line-string-limitation
Ограничения на статический массив типа char[] ещё строже. Это связано с тем, что программный стек ограничен 2 МБ и может произойти так, что под массив в стеке не хватит места. Например, такой код, который содержит большой массив строк
#pragma once
int main() {
char text[2048][1024]{};
}
гарантированно приведёт к ошибке времени выполнения stack overflowhttps://learn.microsoft.com/ru-ru/troubleshoot/windows-client/shell-experience/command-line-string-limitation
Илья Захаринский
Тогда уж следует добавить, что слишком длинные строки совсем необязательно распределять в стеке. Их можно сделать глобальными или статическими, что, впрочем, в большинстве случаев тоже плохо, а лучше всего - динамическими (с помощью функции malloc в си или оператора new в си++), и тогда ваши строки будут ограничены только общим объёмом памяти или ограничениями для прямой адресации в некоторых архитектурах.
Может, если в оперативной памяти не хватит места под строку.
Оба ответа выше верные, поэтому повторяться не буду. Спрошу только: при чём тут переполнение int? При переполнении int просто обнулится, и больше ничего не произойдёт.
Сергей Бондаренко
при переполнении наше число просто не впихнется в int, так как int не вмещает такие размеры, аналогично я спрашивал и про строки
Похожие вопросы
- почему надо задавать числам инты и флоты, а не стринги?
- Как реализовать поиск похожей строки в базе данных?
- Найти максимальный элементы в строке матрицы
- Программирование на С++ (строки)
- Обработка переполнения в операциях с целыми типами данных в языке С.
- Переполнение стэка на языке Си
- В чем разница при переполнении целочисленных типов между беззнаковыми и знаковыми типами C++?
- Что за числа выводятся при переполнении int в C++?
- Двумерный динамический массив с неизвестны количеством столбиков или строк
- Передача строк в функцию С++