Вы не передаете массив, вы только передаете указатель на int. Линия
void func(int arr[],int xNumOfElem)
это просто другой способ написать
void func(int* arr,int xNumOfElem)
сам компилятор не может выделить память для копии а, поскольку размер а является динамическим и поэтому неизвестен компилятору выведите значения a после вызова func, чтобы увидеть, что a изменилось.
Чтобы получить копию, измените метод func на:
void func(int const* const b,int xNumOfElem)
{
int* arr = malloc(sizeof(int)*xNumOfElem);
memcpy(b,arr,xNumOfElem);
int j;
for(j=0; j<xNumOfElem; j++)
{
arr[j] = j + arr[j];
printf("%d\t",arr[j]);
}
printf("\n");
free(arr);
}