Existem várias maneiras de criar uma matriz de cadeias em C. Se todas as cadeias tiverem o mesmo comprimento (ou pelo menos o mesmo comprimento máximo), você simplesmente declara uma matriz 2-d de caractere e atribui conforme necessário:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
Você também pode adicionar uma lista de inicializadores:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
Isso pressupõe que o tamanho e o número de strings no inicializador correspondam às dimensões da matriz. Nesse caso, o conteúdo de cada literal de cadeia de caracteres (que é uma matriz de caracteres com terminação zero) é copiado para a memória alocada para strs. O problema com essa abordagem é a possibilidade de fragmentação interna; se você tiver 99 cadeias de caracteres com 5 caracteres ou menos, mas uma cadeia com 20 caracteres, 99 terão no mínimo 15 caracteres não utilizados; isso é um desperdício de espaço.
Em vez de usar uma matriz 2-d de char, você pode armazenar uma matriz 1-d de ponteiros em char:
char *strs[NUMBER_OF_STRINGS];
Observe que, nesse caso, você alocou apenas memória para reter os ponteiros nas seqüências de caracteres; a memória para as próprias seqüências de caracteres deve ser alocada em outro lugar (como matrizes estáticas ou usando malloc()
ou calloc()
). Você pode usar a lista de inicializadores como no exemplo anterior:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
Em vez de copiar o conteúdo das constantes de seqüência de caracteres, você está simplesmente armazenando os ponteiros para elas. Observe que as constantes de string podem não ser graváveis; você pode reatribuir o ponteiro, assim:
strs[i] = "bar";
strs[i] = "foo";
Mas você pode não conseguir alterar o conteúdo da string; ou seja,
strs[i] = "bar";
strcpy(strs[i], "foo");
pode não ser permitido.
Você pode usar malloc()
para alocar dinamicamente o buffer para cada sequência e copiar para esse buffer:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
BTW,
char (*a[2])[14];
Declara a como uma matriz de 2 elementos de ponteiros para matrizes de 14 elementos de caracteres.
char (*a[2])[14]
é uma matriz de dois ponteiros para uma matriz de 14 caracteres.