Итак, код:
char **three = ( char** )malloc( sizeof( char* ) );
Выделяет массив указателей на символ, но только с одним элементом.Переменная three
является указателем на указатель на символ.Почти так же, как:
char *three[1];
Обычно (как указывает @paxdiablo) было бы более привычно выделять количество указателей:
int line_count = 66;
char **three = ( char** )malloc( line_count * sizeof( char* ) );
После выделения это может бытьиспользуется с обозначением массива:
three[0] = "The Owl and the Pussy-cat went to sea";
three[1] = "In a beautiful pea-green boat,";
three[2] = "They took some honey, and plenty of money,";
three[3] = "Wrapped up in a five-pound note."
В char**
нет ничего особенного, каждая программа на C / C ++ получает его в качестве argv
.
Как программист, вы нена самом деле вы не знаете, что ваш указатель имеет размер 8 , вы знаете, что указатель будет иметь размер некоторый .Вот тут и приходит sizeof( char* )
. Во время компиляции компилятор заменяет это на реальное значение.Таким образом, когда архитектура будет 16, 32 или 64-битной (или, возможно, 128-битной в будущем), код все равно будет компилироваться нормально.