char * array [3] [2] - не что иное, как двумерный массив указателей. Следовательно, для хранения указателей требуется пространство хранения 3 * 2 * sizeof (char *).
Как вы упомянули, указатели на самом деле указывают на строки с нулевым завершением, и вам может понравиться, что строки также должны быть malloc'ed. Предполагая, что общая длина всех строк равна N (включая нулевое завершение), требуется место для хранения (3 * 2 * sizeof (char *) + N).
Выделите память для вышеупомянутого размера и скопируйте строки как показано ниже.
В следующем коде, мы предполагаем, что число столбцов (2) является константой
char *(*dst)[2] = (char *(*)[2]) malloc(3*2*sizeof(char *) + N);
char * s = ((char *) dst) + (3*2*sizeof(char *));
for (i = 0; i < 3; i++)
{
for (j = 0; j < 2; j++)
{
strcpy(s, src[i][j]);
dst[i][j] = s;
s += strlen(s)+1;
}
}
Примечание: В приведенном выше коде, «ДСТ» представляет собой указатель, который указывает на первую строку 2D-массив char *.
Если количество столбцов не является постоянным, синтаксис немного меняется, но размер хранилища тот же.
char **dst = (char **) malloc(3*2*sizeof(char *) + N);
char * s = ((char *) dst) + (3*2*sizeof(char *));
for (i = 0; i < 3; i++)
{
for (j = 0; j < 2; j++)
{
strcpy(s, src[i][j]);
dst[i*2 + j] = s; /* 2 is the number of columns */
s += strlen(s)+1;
}
}
Примечание: Здесь «ДСТ» указатель, который указывает на первый элемент массива 1D символ * и 2D индексации осуществляется вручную.
В приведенных выше примерах предполагается, что длины строк не будут изменены после выделения. Если строки могут меняться в любой момент времени после выделения, то лучше выделять для каждой строки отдельно.
Существует простой способ просмотра и ответа на этот вопрос !! – JackCColeman