malloc обнуление памяти? - PullRequest
       19

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

14 голосов
/ 26 октября 2009

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

Ответы [ 6 ]

35 голосов
/ 26 октября 2009

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

7 голосов
/ 26 октября 2009

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

2 голосов
/ 26 октября 2009

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

2 голосов
/ 26 октября 2009

Значение в выделенной памяти официально не определено. 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);
}
1 голос
/ 26 октября 2009

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

0 голосов
/ 20 января 2019

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

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