You must decide if you are using C or C ++. These languages ββvary widely in situations like yours.
In C ++, a "pointer to an array [] " (i.e. an array of indefinite size) is a completely different type from a "pointer to an array [N]" (i.e. an array of a specified size). This immediately means that your code is not able to compile C ++ code. This is not a warning, this is a mistake. If you want your code to compile as C ++, you need to specify the size of the exact array in the return type of the function
char (*(*x())[4])()
And, of course, you need to return &funclist , since you are declaring your function as returning a pointer to an array.
In main declaring the receiving pointer as char (**fs)() makes no sense. The function returns a pointer to an array, not a pointer to a pointer. You must declare your fs as
char (*(*fs)[4])();
i.e. as having the type of a pointer to an array (note the similarity to the function declaration). And to call a function through such a pointer, you must do
printf("%c\n", (*fs)[1]());
In C, the explicit size of the array in the array pointer declarations can be omitted, since in the C pointer "for type [], the array is" compatible with "pointer to array type [N]", but the other items are still there. However, even in C, it may make sense to specify this size explicitly.
Alternatively, you can stop using the pointer-array type and use the pointer-to-pointer type instead. In this case, your function should be defined as follows
char (**x())() { static char (*funclist[4])() = {foo, bar, blurga, bletch}; return funclist;
and in main you will work with it as follows
char (**fs)(); fs = x(); printf("%c\n", fs[1]());
Please note that this main is the same as what you had in the original message. In other words, your source code is a fancy merger of two different completely incompatible methods. You must decide which one you want to use and stick to it.