The way to combine arrays in different cores to a big array by MPI is using MPI_Allgatherv. An example I would like to test is like this.
Core 1 : 1
Core 2 : 2 2
Core 3 : 3 3 3
Core 4 : 4 4 4 4
Core 5 ...
After combine all the arrays, I will get
1 2 2 3 3 3 4 4 4 4 5 5 ...
Here is the code(test_allgatherv.c) and Makefile for this calculation. Pay attention to displ_list.
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
  int my_rank; // MPI rank
  int size; // MPI size
  int i; 
  int *local_array; // array in local core 
  int local_num; // num of elements in local array
  int *local_num_list; // the list of local_num 
  int *displ_list; // the displ_list of global_array
  int *global_array; // array in global
  int global_num; // sum of local_num
  // MPI related variables
  MPI_Init (&argc, &argv);
  MPI_Comm_rank (MPI_COMM_WORLD, &my_rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  // generate local array
  local_num = my_rank + 1;
  local_array = (int *) malloc (local_num*sizeof(int));
  for (i=0;i<local_num;i++) {
    local_array[i] = local_num;
    printf("%d \n", local_num);
  }
  // calculate global_num = sum[local_num]
  MPI_Allreduce(&local_num, &global_num, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
  // using MPI_Allgatherv the calculation of displ_list is a little tricky
  global_array = (int *) malloc (global_num*sizeof(int));
  displ_list = (int *) malloc (size*sizeof(int));
  local_num_list = (int *) malloc (size*sizeof(int));
  MPI_Allgather(&local_num, 1, MPI_INT, local_num_list, 1, MPI_INT, MPI_COMM_WORLD);
  displ_list[0] = 0;
  for (i=1;i<size;i++) {
    displ_list[i] = displ_list[i-1] + local_num_list[i-1];
  }
  MPI_Allgatherv(local_array, local_num, MPI_INT, global_array, local_num_list, displ_list, MPI_INT, MPI_COMM_WORLD);
  // output the global_array
  if (my_rank == 0){
    printf("after MPI_Allgatherv\n");
    for (i=0;i<global_num;i++){
      printf("%d %d\n",i , global_array[i]);
    }
  }
  MPI_Finalize();
  return 0;
}
And the Makefile.
CC=mpicc
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=test_allgatherv.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=test_allgatherv
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@
.c.o:
    $(CC) $(CFLAGS) $< -o $@
After compiling, run the job by
mpirun -n 8 ./test_allgatherv
I got the correct result
1 
2 
2 
4 
4 
4 
4 
5 
5 
5 
5 
5 
8 
8 
8 
8 
8 
8 
8 
8 
3 
3 
3 
6 
6 
6 
6 
6 
6 
7 
7 
7 
7 
7 
7 
7 
after MPI_Allgatherv
0 1
1 2
2 2
3 3
4 3
5 3
6 4
7 4
8 4
9 4
10 5
11 5
12 5
13 5
14 5
15 6
16 6
17 6
18 6
19 6
20 6
21 7
22 7
23 7
24 7
25 7
26 7
27 7
28 8
29 8
30 8
31 8
32 8
33 8
34 8
35 8