Я считаю, что это работает, потому что ваша реализация malloc
помещает некоторую информацию до и после блока памяти и, возможно, распределяет по блокам (например, округляет запрос на выделение до ближайших 64 байтов). malloc
ed память должна иметь возможность освобождаться, а для этого требуется некоторая информация о ее размере и так далее, эта информация помещается непосредственно перед и/или после выделенной памяти.
Если данные распределены по частям, то будет некоторый предел, которого вы можете достичь, когда вы полностью заполните один «блок», а чтение array[n]
будет за пределами конца «блока». Мы можем проверить это следующим образом:
int main() {
int i;
char * a;
for (i = 1; i < 10000; i++) {
a = malloc(i);
a[i] = 'x';
printf("%d %c\n", i, a[i]);
free(a);
}
return 0;
}
Он malloc
создает все более крупные блоки памяти и проверяет наличие сегментных ошибок, выходящих за пределы допустимого диапазона. Усеченный вывод, который я получаю:
1 x
[...]
58 x
59 x
60 x
61 x
62 x
*** glibc detected *** ./a.out: free(): invalid next size (normal): 0x0a041008 ***
[...]
т.е. попытка сделать a = malloc(63); a[63] = 'x';
терпит неудачу, потому что это искажает метаданные, о которых я говорил ранее.
person
huon
schedule
16.08.2012