Вопрос

Учитывая этот 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 не обнуляет память, но многие операционные системы обнуляют память, которую ваша программа запрашивает по соображениям безопасности (чтобы один процесс не мог получить доступ к потенциально конфиденциальной информации, которая использовалась другим процессом ).

Другие советы

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

Значение в выделенной памяти официально не определено. C99 сообщает: Функция malloc выделяет пространство для объекта, размер которого определяется размером, а значение которого не определено. malloc () может делать все, что захочет, включая обнуление. Это может быть преднамеренным, побочным эффектом реализации, или у вас может просто быть много памяти, которая оказывается равной 0.

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

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

Malloc не должен заполнять память. По причинам производительности версии выпуска часто ничего не делают с памятью. «Безопасный» библиотека может иметь реализацию malloc, которая очищает память. Это зависит от реализации библиотеки. Есть несколько общих шаблонов, которые заполняются в память различными отладочными библиотеками компилятора, которые являются объяснено в этом разделе, посвященном стековому потоку .

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top