As coded, printer takes a string and prints every final substring. You pass *words, which is the same as words[0], ie: the first string in the 2D array.
To pass a pointer to the array, the type of the argument should be char array[][10](*).:
#include <stdio.h>
char words[][10] = { "madam", "Russia", "India", "Japan", 
                     "China", "Brazil", "Mexico" };
int size = sizeof(words) / sizeof(words[0]);
void printer(char words[][10], int len);
int main() {
    printer(words, size);
    return 0;
}
void printer(char words[][10], int len) {
    for (int i = 0; i < len; i++) {
        printf("%s\n", array[i]));
    }
}
Note however that you could also define array as an array of pointers to character strings char *array[]. This would allow for strings of any length, not limited to 9 characters plus a null terminator.
The code would be changed to this:
#include <stdio.h>
char *words[] = { "madam", "Russia", "India", "Japan", 
                  "China", "Brazil", "Mexico" };
int size = sizeof(words) / sizeof(words[0]);
void printer(char *words[], int len);
int main() {
    printer(words, size);
    return 0;
}
void printer(char *words[], int len) {
    for (int i = 0; i < len; i++) {
        printf("%s\n", array[i]));
    }
}
The array words is initialized from string literals, which must not be changed, so it would be better to define it as const char *array[] and modify printer accordingly.  Note also that printf("%s\n", array[i])) is equivalent to puts(array[i]) (good compilers detect this equivalence and generate the call to puts in both cases):
#include <stdio.h>
const char *words[] = { "madam", "Russia", "India", "Japan", 
                        "China", "Brazil", "Mexico" };
int size = sizeof(words) / sizeof(words[0]);
void printer(const char *words[], int len);
int main() {
    printer(words, size);
    return 0;
}
void printer(const char *words[], int len) {
    for (int i = 0; i < len; i++) {
        puts(array[i]);
    }
}
(*)  The function does not receive an actual 2D array as argument, but a pointer to the array of arrays, which technically has type char (*)[10] but the compiler will accept both syntaxes equivalently and char array[][10] is simpler and more readable
     
    
main()(well, you didn't) that does exactly what you want - Why did you try something different in yourprinterfunction?words, do you need it to be array of arrays of 10 characters which is what you have now (can fit 9 character string)? Or would you be find with array of pointer to const char (which can be string literal), that isconst char *words[] = { ... };?