Автор
|
Тема: символьный массив
|
MasyA |
опубликован 15-01-2002 15:13 MSK
Есть у меня в проге такая массив: char buffer[128]; Сразу после инициализации глянул на него и увидел типа такого: "Ёъ3|оЖ " и т.д. Получается такой массив только выделяет место в памяти,но не очищает его(типа buffer="")? P.S: В MSDN не нашел топика на эту тему.
|
rodion
|
опубликован 15-01-2002 15:20 MSK
Кто сказал что он должен что то очищать? С какой стати? |
MasyA
|
опубликован 15-01-2002 15:41 MSK
А почему бы и нет.Дофига вещей за нас делает VC,почему-бы и не очистить? Я ж не возмущаюсь,что за меня вообще VC должен сам проги писать,я просто спрашиваю как оно обстоит на самом деле. Так вот :) |
eyes
|
опубликован 15-01-2002 15:47 MSK
Мало ли чем ты собрался заполнить свой буффер. Может и инициализация не нужна вообще (это должен решать сам программист). |
michl_m
|
опубликован 15-01-2002 19:46 MSK
MasyA , ты неправ. Скажи спасибо компилятору, что он позволяет вещи типа char str[256]="My string"; А то ты захотел так: int i; i += 10; и в результате (i==15), т.к. в начале ты считал, что i=5. Так ведь не бывает, в лучшем случае i=0 в debug. Резюме: всегда надо инициализировать: int i(0); char a[256]("aaaaaa");P.S. Последние две строки - шутка. Хотя работает( принцип конструктора, в С++ все имеет конструкторы, даже int). |
rivitna
|
опубликован 15-01-2002 21:35 MSK
В чем прелесть неинициализированных данных? В размере exe-ника! За инициализацию надо платить кодом! А твой buffer - это просто область памяти, зарезервированная область памяти. Есть так называемая секция BSS PE-файлов, куда помещаются неинициализированные данные. Она учитывается в секции .data, раздвигая ее размер до требуемого. Если тебе так неймется инициализировать, добавь перед использованием buffer: buffer[0] = '\0' Это займет примерно 8 байт кода вместо 128 - выигрыш налицо!
|
ADK
|
опубликован 16-01-2002 05:51 MSK
buffer[0] = '\0' - только для строк прокатит. Я всегда так делаю, и для структур, в результате многие поля не надо заполнять - ZeroMemory(pBuf, nBufSize); и всё! |
eyes
|
опубликован 16-01-2002 07:36 MSK
>Она учитывается в секции .data, раздвигая ее размер до требуемого.Выход только один: пихать в стек? |
rivitna
|
опубликован 16-01-2002 08:08 MSK
> Выход только один: пихать в стек?Не всегда! Много в стек не пихнешь. Команда ассемблера enter, которую VC вставляет в пролог для локальных переменных, позволяет в стек пихнуть максимум 65535 байт. Даже если пользоваться sub esp,LOC_SIZE. Можно упасть на дно стека! Стек это не панацея! Даже иногда может привести к прикольным моментам, если в программе есть переключение с одного уровня привилегий на другой. В этом случае стек подменяется. Надо все писать к месту из соображений удобства и эффективности. Что-то можно, как неинициализированные данные, что-то в стеке, а что-то в куче, что чаще. |
eyes
|
опубликован 16-01-2002 08:32 MSK
> Выход только один: пихать в стек?Я кучу и имел в виду. [Как отвратительно в России по утрам] |