Das Problem ist, dass allocate_memory den Parameter arr selbst ändert. Das funktioniert nicht, denn der Pointer an sich wird auch nur by-Value übergeben, also kopiert. Du musst hier also mit einem int** arbeiten:

Code:
#include <stdio.h>
#include <stdlib.h>

void allocate_memory(int **arr, int arraysize) {
  int i;

  *arr = (int *) malloc(sizeof(int)*arraysize);

  (*arr)[0]=arraysize;

  for (i=1; i<arraysize; i++) (*arr)[i]=i;
}

void read_memory(int *arr) {
  int i;

  for (i=0; i<arr[0]; i++) printf("arr[%i]=%i\n",i,arr[i]);
}

int main()
{
  int *arr;

  allocate_memory(&arr,4);
  read_memory(arr);

  return 0;
}