your char** is actually a number which thinks that number is an address of a number which is an address of a valid character...
to put it simply:
// I am a number that has undefined value, but I pretend to point to a character.
char *myCharPointer;
// | The statement below will access arbitrary memory
// | (which will cause a crash if this memory is not allowed to be accessed).
char myChar = *myCharPointer;
To make use of this pointer, you have to initialize it.
char *myCharPointer = (char *)malloc(10 * sizeof(char));
now, you can use this pointer in the same way you deal with arrays, or due pointer arithmetic if you want.
Note that malloc does not set all values in the "array" to 0, their values are undefined by default.
In order to do what you want to do, you have to do the following:
// I can store 10 "strings"
char **myArrayOfStrings = (char **)malloc(10 * sizeof(char *));
char *str0 = "Hello, world0";
char *str1 = "Hello, World1";
char *str2 = "Hello, World2";
char *str3 = "Hello, world3";
char *str4 = "Hello, world4";
char *str5 = "Hello, world5";
char *str6 = "Hello, world6";
char *str7 = "Hello, world7";
char *str8 = "Hello, world8";
char *str9 = "Hello, world9";
myArrayOfStrings[0] = str0;
myArrayOfStrings[1] = str1;
myArrayOfStrings[2] = str2;
myArrayOfStrings[3] = str3;
myArrayOfStrings[4] = str4;
myArrayOfStrings[5] = str5;
myArrayOfStrings[6] = str6;
myArrayOfStrings[7] = str7;
myArrayOfStrings[8] = str8;
myArrayOfStrings[9] = str9;
// the above is the same as
// *(myArrayOfStrings + 9) = str9
You don't have to have the strings of same length of anything,
suppose str[0..9] are actually numbers that store the address of where the first character of these strings is located in memory, eg
str0 = (char *)&9993039;
str1 = (char *)&9993089;
myArrayOfStrings is actually also a number which stores the address of the first string location, in particularmyArrayOfStrings = (char **)&str0;
Obviously, you will not do this explicitly as I shown, but this can be done at runtime without much issue, just store a string from the user in the buffer, then append it to the list, hoping that it doesn't run out of space (there are techniques to avoid that).
Hopefully this helped.