Реальный вопрос в том, почему вы вообще ожидаете, что это сработает? Вы освобождаете x, а затем возвращаете освобожденный указатель, который является бессмысленным.
Происходит следующее:
Внутри функции вы выделяете 5 пробелов, x указывает на первый
свой адрес.
Вы пишете 0, 1, 2, 3, 4 в этих местах.
Вы освобождаете x, поэтому все 5 пробелов больше не зарезервированы.
Вы выходите из функции, делая так, чтобы 2 следующие свободные области памяти были
используется, которые, как оказалось, те, где вы написали 0 и 1.
- Вы печатаете значения, содержащиеся в 5 областях памяти, которые вы уже
освобожден, где те, в которых вы написали 0 и 1, оказались
повторно используется для чего-то другого; отсюда и странные цифры.
Как правило, не пытайтесь читать области памяти, которые я освободил; еще хуже, не пытайтесь писать там.
Доступ к нераспределенной памяти ведет к неопределенному поведению.
Кроме того, вам не нужно объявлять функцию в отдельной строке, если между ними ничего не будет; плюс вам не нужно приводить то, что возвращает malloc, к типу; это пустота *, которая по умолчанию может содержать все, что вы в нее бросаете. Важен ваш базовый тип переменной. Смотрите здесь
Исправленный код:
#include <stdlib.h>
int *create_array(int elements) {
int i,*x = malloc(elements*sizeof(int));
for(i=0;i < elements;i++) {
x[i] = i;
}
return x;
}
int main(void) {
int j, *arr;
arr = create_array(5);
for(j=0;j<5;j++) {
printf("%d\n",arr[j]);
}
free(arr);
return 0;
}