Почему этот код работает? Даже если я выделяю только 1 int, используя malloc? В таком случае ответ в неопределенном поведении.
Блок выделения 4
байтов, таких как
int *a = (int *)malloc(sizeof(int)); /* No need to cast the malloc result */
и доступ к этому как
a[i] = i; /* upto i<1 behavior is guaranteed as only 4byte allocated, not after */
приводит к неопределенному поведению Т.е. может случиться что угодно, и вы не должны зависеть от того, что он делает одно и то же дважды.
Примечание, приведение типа результата malloc()
не требуется, поскольку malloc()
тип возврата void*
и его автоматическое преобразование безопасно в требуемый тип. Прочитайте Я разыгрываю результат malloc?
И всегда проверяйте возвращаемое значение malloc()
. например,
int *a = malloc(sizeof(int));
if( a != NULL) {
/* allocated successfully & do_something()_with_malloced_memory() */
}
else {
/* error handling.. malloc failed */
}