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