Arrays of arrays of different size is possible in C. Simply they are not 2D arrays but arrays or pointers. You will find more about the difference in that answer from C tag FAQ.
@vahero has shown how you could dynamically allocate that, but it is also possible with static or automatic storage:
char row0[] = "TT"; // size 3 because of the terminating null...
char row1[] = "TTTTT";
char row2[] = "TTT";
char row3[] = "TTTT";
char* array[] = { row0, row1, row2, row3};
Or without additional variable identifiers:
char *arr[] = {
(char[]){ 'T', 'T', 0 },
(char[]){ 'T', 'T', 'T', 'T', 'T', 0 },
(char[]){ 'T', 'T', 'T', 0 },
(char[]){ 'T', 'T', 'T', 'T', 0 },
};
You can then use is as usual:
for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++) {
for(int j=0; arr[i][j] != '\0'; j++) {
printf("%c ", arr[i][j]);
}
printf("\n");
}