Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Malloc обнуляет память?

Автор вопроса: endeavormacОтветов: 6

Учитывая этот код C, скомпилированный с gcc 4.3.3

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char * argv[])
{

    int * i;

    i = (int *) malloc(sizeof(int));

    printf("%d\n", *i);
    return 0;

}

Я ожидаю, что на выходе будет то, что было в памяти, которую возвращает malloc(), но вместо этого на выходе будет 0. Обнуляет ли malloc память, которую он возвращает? Если да, то почему?

  • То, что вы ожидаете, имеет место. Он выводит все, что было в памяти, которую возвращает функция malloc(), которая оказалась равной нулю. David Schwartz 30.08.2011

cmalloc

Ответы

Ответ 1 · рейтинг 38 · Robert Gamble

malloc сама по себе не обнуляет память, но многие операционные системы обнуляют память, которую ваша программа запрашивает из соображений безопасности (чтобы один процесс не мог получить доступ к потенциально конфиденциальной информации, которая использовалась другим процессом).

Ответ 2 · рейтинг 8 · Greg Hewgill

Функция malloc() не устанавливает для выделенной памяти какое-либо конкретное значение. Если вы хотите убедиться, что память равна нулю, используйте calloc() или эквивалент. В противном случае вы получите то, что было раньше (что в вашем случае может быть равно нулю).

Ответ 3 · рейтинг 2 · Schwern

Значение в выделенной памяти официально не определено. C99 утверждает: The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate. malloc() может делать все, что захочет, включая обнуление. Это может быть преднамеренным, побочным эффектом реализации, или у вас может быть просто много памяти, которая равна 0.

FWIW на OS X с Apple gcc 4.0.1 Я не могу заставить его выйти не 0, даже выполняя много распределений:

for( idx = 0; idx < 100000; idx++ ) {
    i = (int *) malloc(sizeof(int));
    printf("%d\n", *i);
}

Ответ 4 · рейтинг 2 · Adisak

Malloc не должен заполнять память. Из соображений производительности релизные версии часто ничего не делают с памятью. "Безопасная" библиотека может иметь реализацию malloc, очищающую память. Это зависит от разработчика библиотеки. Есть несколько общих шаблонов, которые заполняются в память различными библиотеками отладки компилятора, to-0xcd-0xdd-etc-on-malloc-free-new">объяснено в этом разделе stackoverflow.

Ответ 5 · рейтинг 1 · pixelbeat

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

Ответ 6 · рейтинг -1 · mistermista

Является ли это int; интервал = 0; или интервал=00000000; он займет столько же места в памяти. printf часто улавливает первый 0 как завершающий нуль независимо от того, что еще находится в строке. Если вы используете компараторы строк, а 0 является заполнителем, я бы порекомендовал вам использовать ЧТО-НИБУДЬ, кроме 0 для этого заполнителя, поскольку библиотеки на основе строк действительно отстой. Попробуйте F, а затем напишите элемент управления в себе, вставив нулевой термин или новую строку, если это необходимо, это будет более переносимо.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы