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

Учитывая этот код, скомпилированный с помощью 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 обнуление памяти, которую он возвращает? Если да, то почему?

Ответы

Ответ 1

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

Ответ 2

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

Ответ 3

Malloc не должен заполнять память. По соображениям производительности версии выпуска часто ничего не делают с памятью. "Защищенная" библиотека может иметь реализацию malloc, которая очищает память. Это зависит от исполнителя библиотеки. Существуют некоторые общие шаблоны, которые заполняются в памяти различными библиотеками отладки компилятора, которые fooobar.com/questions/20796/....

Ответ 4

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

Ответ 5

Значение в выделенной памяти официально undefined. 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);
}

Ответ 6

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