Как уже показано, ключевое различие составляет распределение в первый раз против распределение .Если вы попробуете:
char *a, tst;
do {
a = malloc(50000000);
a[49999999] = '\0';
printf("%50s\n%p", a, a); // it outputs nothing 1st, but bbbb.... 2nd
tst = a[5000]
memset(a, 'b', 50000000);
free(a);
} while (tst == '\0');
, вы получите две строки (скорее всего, по крайней мере, если указатели совпадают).
Ключ в том, что блок памяти, возвращаемый malloc()
имеет неопределенное содержимое .Это может быть или не быть нулем, и зависит от того, как программа выделяла память в прошлом (или какие средства отладки памяти используются).
Если вы хотите гарантировать содержимое, вам нужно calloc()
или явная инициализация после выделения.
С другой стороны, гарантия целостности системы / разделения данных означает, что любое начальное адресное пространство, запрошенное системой, - либо через sbrk()
или mmap(MAP_ANON)
- должны быть инициализированы нулями, так как любое другое их содержимое может представлять собой брешь в системе безопасности.