The *hold_array[] is an array of pointers. The function get_array returns a single pointer, albeit that the returned pointer is a pointer to an array of char * pointers. However, you cannot declare *hold_array[] as an array of pointers without any dimension. The compiler has no idea how much space to allocate for it. It doesn't know how many pointers you'll need.
You can declare it as **hold_array. This is a single pointer which points to an array of pointers. I know it sounds the same, but it isn't exactly. In the case of *hold_array[] you are allocating multiple pointers and therefore need a dimension. In the case of **hold_array you are allocating one pointer which points to an array of pointers. In your initializer static char *array[] the compiler sees you need two pointers and internally dimensions it for you as *array[2].
Therefore in main() you are asking the compiler to create an array of unknown dimension which consists of char * pointers. The function get_array returns the address of an array of pointers, but not the individual pointers within the array. Remember that array[0] is a pointer to the string "test1" and array[1] is a pointer to the string "test2". The strings themselves are character arrays with a 0 byte at the end.
Another way to think of it is:
char *test1 = "test1";
char *test2 = "test2";
char *array[2];
char **hold_array;
array[0] = test1;
array[1] = test2;
hold_array = array;
printf("\n%s = %s", hold_array[0], array[0]); //print the same string
Therefore, when you return array the compiler assumes you mean the array itself since you haven't otherwise specified a member of the array. So only the address of array itself is returned. This is identical to **hold_array. Which means hold_array = array. **hold_array is a single pointer which points to an array of pointers. array[2] is an array of pointers which allocated space for 2 pointers.
hold_arrayand the return value ofget_arrayshould bechar **, notchar *. 2,char_array()has to be declared beforemain()or it will be assumed to returnint.