обнуление памяти - PullRequest
       12

обнуление памяти

24 голосов
/ 21 мая 2010

gcc 4.4.4 C89

Мне просто интересно, что делает большинство программистов на С, когда они хотят обнулить память.

Например, у меня есть буфер 1024 байта. Иногда я делаю это:

char buffer[1024] = {0};

Который будет обнулять все байты.

Тем не менее, я должен объявить это так и использовать memset?

char buffer[1024];
.
.
memset(buffer, 0, sizeof(buffer));

Есть ли реальная причина, по которой вы должны обнулить память? Что самое худшее, что может случиться, если вы этого не сделаете?

Ответы [ 12 ]

1 голос
/ 21 мая 2010

Я также использую memset (буфер, 0, sizeof (буфер));

Риск не использовать его состоит в том, что нет гарантии, что используемый вами буфер полностью пуст, может быть мусор, который может привести к непредсказуемому поведению.

Всегда устанавливайте значение 0 после malloc, это очень хорошая практика.

0 голосов
/ 21 мая 2010

Я не знаком с:

char buffer[1024] = {0};

техник. Но если предположить, что это делает то, что я думаю, есть (потенциальное) различие между этими двумя методами.

Первый выполняется во время COMPILE, и буфер будет частью статического образа исполняемого файла и, следовательно, будет 0 при загрузке.

Последнее будет сделано в RUN TIME.

Первое может привести к некоторому поведению во время загрузки. Если у вас просто есть:

char buffer[1024];

современные загрузчики вполне могут "виртуально" загрузить это ... то есть, это не займет реального места в файле, это будет просто инструкция загрузчику вырезать блок, когда программа загружен. Мне не очень комфортно с современными грузчиками, говорят, правда это или нет.

Но если вы предварительно инициализируете его, то это, безусловно, нужно будет загрузить из исполняемого файла.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...