Прежде чем использовать такие многоуровневые указатели, я рекомендую прочитать о динамическом распределении памяти в C.
Всякий раз, когда вы используете указатели, вы должны также подумать, нужно ли вам выделять место для данных, которые указателисобирается указывать (как и сами указатели, для многоуровневых указателей).
Например,
char **bar;
здесь, bar выделяет пространство для 1 указателя на указатель, т.е.,достаточно места для хранения одного адреса.Это не очень полезно без какого-либо дополнительного распределения данных.
На самом деле, вы должны сделать следующее:
char **bar = calloc( 2 , sizeof(char *) );
здесь bar выделяет место для 1 указателя на указатель, т.е.Опять же, место для хранения одного адреса в виде строки И 2 последовательных расположения для хранения еще двух указателей, а именно: bar [0] и bar 1 .
char bar[0]= calloc( 10 , sizeof(char) );
здесь, bar [0]выделяет место для хранения строки размером 10 - 1 (для \ 0 в конце).
Теперь, если вы выполняете копирование строки:
strcpy(bar[0],"Hello!");
, окончательная карта памяти будет иметь вид: (адреса в кружках, содержимое в блоках)