LINUX.ORG.RU

C, C++. Какова максимальная длина сишных строк (сегфолт на строке длиной ~640 Кб, GCC)?


0

4

Сейчас словил сегфолт при выводе строки длиной 636180 байт.

Сегфолтная команда:

fprintf(stderr, "%s", message);

где message имеет тип «const char *message» и размер данных в 636180 байт.

В стеке вызовов видно, что после функции fprintf() были вызваны:

strlen ()	
__GI__IO_fputs (str=0xb2379018 <Address 0xb2379018 out of bounds>, fp=0xb6ecc960 <_IO_2_1_stderr_>)

- т. е. сначала fputs(), последней strlen().

Сегфолт в дебрях strlen(). (Мне не нравится и строка с fputs(), ибо в ней «Address 0xb2379018 out of bounds»).

Таких проблем на коротких строках (чуть более 1000 знаков) не возникает.

Вопрос: существуют какие-то ограничения в компиляторах на работу с сишными строками? Я то думал, что размер строки ограничивается максимальным числом unsigned int. А тут вона как - 630 КБ прожевать не может.

Или, к примеру, существует какое-то ограничение на работу с потоком ошибок, только я о нем не знаю?

Если это важно: gcc (Debian 4.7.1-7) 4.7.1

★★★★★
Ответ на: комментарий от erfea

У меня комменто-слепота. Все вокруг сыпят фактами (имеющими отношение к теме) и цитатами, а я, дурак, всё твержу одно.

Вот и ты пытаешься мне что-то объяснить. Попробуй прочитать документацию и объяснить мне своими словами, а? Может тогда мой страшный недуг отступит, на время.

ziemin ★★
()
Ответ на: комментарий от ziemin

Может ты сам попробуешь в этом разобраться? Это настолько простые вещи, что ждать своего героя, который все тебе разжует, глупо. ;)

anonymous
()
Ответ на: комментарий от ziemin

У меня комменто-слепота. Все вокруг сыпят фактами (имеющими отношение к теме) и цитатами, а я, дурак, всё твержу одно.

Я тебе твержу элементарными терминами: «Стек, куча, выражение, класс, объект, поле, указатель»

объяснить мне своими словами, а?

Я не знаю чем тебе заменить эти определения, это базовые вещи, которые программист обязан знать. Действия либы и прочее я тебе объяснял и ссылкой на доки и своими словами.

Я аж (почти) прослезился! Куда пропали старые добрые области видимости, о которых я слышал в детстве?

Ты лучше усвой как следует что такое стек, куча и выражение (в котором могут быть временные объекты). Ты должен понимать что, если объект возвращенный из функции (не важно метод это класса или что-то ещё) не разместить в памяти (стек или куча), по завершении выражения пропадает.

erfea ★★★★★
()
Последнее исправление: erfea (всего исправлений: 1)
Ответ на: комментарий от anonymous

Подойди с другой стороны. Я просто прав, а это вы со мной соревнуетесь (пока не впечатляюще, кстати)

ziemin ★★
()
Ответ на: комментарий от ziemin

Все вокруг сыпят фактами (имеющими отношение к теме) и цитатами, а я, дурак, всё твержу одно.

всё верно. Только «дурак» как-то мягко сказано

mashina ★★★★★
()
Ответ на: комментарий от anonymous

Зачем проверять, если я и так знаю, что прав? Может в мелочах я и ошибаюсь (совсем маленькие мелочи), но всё работает. ТС подтвердил.

Пока ни одного правдоподобного варианта развития событий никто не предложил.

ziemin ★★
()
Ответ на: комментарий от mashina

Аргументы (которых и так не было) кончились?

ziemin ★★
()
Ответ на: комментарий от ziemin

Вроде хорошо объяснил, но всё равно что-то не веритсо. Можно цитаты?

Какие тебе цитаты? Хочешь хоть чему-то научиться, прочитай для начала про память, Павловскую (Выражения стр37, Указатели стр51, Классы стр 178, Деструкторы стр188). Освой базовые вещи. Пока ты их не освоишь я тебе ничего не смогу объяснить, а если нужен учитель, то за полный курс крестов я возьму бабок.

erfea ★★★★★
()
Ответ на: комментарий от ziemin

Пока ни одного правдоподобного варианта развития событий никто не предложил.

Их уже написали множество, причем совершено разные люди. Ты просто не читаешь.

toLocal8Bit возвращает объект QByteArray, для которого вызывается метод data. Дальше компилятор считает, что этот временный объект никому не нужен и разрушает его. Результирующий указатель продолжает указывать на данные уже разрушенного объекта.

anonymous
()
Ответ на: комментарий от anonymous

toLocal8Bit возвращает объект QByteArray, для которого вызывается метод data. Дальше компилятор считает, что этот временный объект никому не нужен и разрушает его. Результирующий указатель продолжает указывать на данные уже разрушенного объекта.

Ты действительно так считаешь или троллишь?

ziemin ★★
()
Ответ на: комментарий от ziemin

Хотел вбросить тонко, но за не знанием элементарных вещей и скудоумием сознания, осталось вбросить жирно.

fixed

erfea ★★★★★
()
Ответ на: комментарий от ziemin

Более того, я уверен в этом. И если посмотреть код, который генерирует компилятор, то можно получить подтверждение этому. К сожалению, ты этого не сможешь сделать, потому что не знаешь ассемблер.

anonymous
()
Ответ на: комментарий от ziemin

Всё так. Я пытаюсь тебе помочь чему-то научиться (раз уж ты влез в в этот тред и блестаешь не знанием элементарных вещей), а ты по факту ссылок на учебные материалы жирно вбрасываешь. Давай удачи тебе, иди поищи еду вкуснее.

erfea ★★★★★
()
Ответ на: комментарий от ziemin

Пока тролишь ты. Сам собери небольшой пример и выложи кусок кода сюда, и мы вместе посмотрим что там происходит. Ok?

anonymous
()
Ответ на: комментарий от Redrum

Ещё один. Буду вежлив.

Иди уже почитай нормальные книги по C++.

Как это изменит факт, благодаря которому, моё решение (+бегемот) работает?

ziemin ★★
()
Ответ на: комментарий от anonymous

Сам собери небольшой пример и выложи кусок кода сюда

См. рис. 1

ziemin ★★
()
Ответ на: комментарий от ziemin

Если выражение передавать в функцию, то компилятор не разрушит ее до выхода из этой функции. Т.е. временный безимянный объект QByteArray будет жить до выхода из функции и указатель возвращаемый data будет указывать на валидные данные.

anonymous
()
Ответ на: комментарий от ziemin

Я это говорил с самого начала. Но ты же в очередной раз показал, что ты писатель, а не читатель. :)))

anonymous
()
Ответ на: комментарий от ziemin

Твоё решение - двадцать раз пересоздать QByteArray из строки. Да, конечно, работает. Вот только конвертация происходит не один раз.

unC0Rr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.