Поскольку компилятор видит это
char myStrings[][20] = {"My 1st string", "My 2nd string", "My 3rd string"};
в
char myStrings[][20] = {(char*), (char*), (char*)};
Затем, errrr ... хммм, с помощью "волшебства компилятора" он может скопировать символы из этих (char*)
в массив myStrings [0] и myStrings [1], ....
Редактировать
Вы не можете иметь «зубчатые массивы» в C. Предположим, у вас было
char my_strings[][] = {"a", "ab", "abc", "foo foo fo foo foo", "abc", "ab", "a"};
my_strings[0]
требуется то же пространство, что и my_strings[3]
, поскольку язык требует, чтобы элементы массива были смежными, и ему нужен определенный размер каждого массива.
my_strings in memory
'a' '\0' '\0' ... '\0' but must be a definite size
'a' 'b' '\0' ... '\0' definite size
...
'f' 'o' 'o' ... '\0'
...
Чтобы найти максимальный размер и инициализировать массив (ы), компилятору потребуется выполнить два прохода над строковыми литералами.