De qualquer forma, é uma má prática inicializar uma matriz de caracteres com uma string literal.
O autor desse comentário nunca realmente o justifica, e acho a afirmação intrigante.
Em C (e você marcou isso como C), essa é a única maneira de inicializar uma matriz char
com um valor de sequência (a inicialização é diferente da atribuição). Você pode escrever
char string[] = "october";
ou
char string[8] = "october";
ou
char string[MAX_MONTH_LENGTH] = "october";
No primeiro caso, o tamanho da matriz é obtido do tamanho do inicializador. Literais de string são armazenados como matrizes char
com um byte final de 0, portanto, o tamanho da matriz é 8 ('o', 'c', 't', 'o', 'b', 'e', 'r', 0) Nos dois segundos casos, o tamanho da matriz é especificado como parte da declaração (8 e MAX_MONTH_LENGTH
, o que quer que seja).
O que você não pode fazer é escrever algo como
char string[];
string = "october";
ou
char string[8];
string = "october";
etc. No primeiro caso, a declaração de string
está incompleta porque nenhum tamanho de matriz foi especificado e não há inicializador para o tamanho. Nos dois casos, =
isso não funcionará porque a) uma expressão de matriz, como string
pode não ser o alvo de uma atribuição eb) o =
operador não está definido para copiar o conteúdo de uma matriz para outra de qualquer maneira.
Da mesma maneira, você não pode escrever
char string[] = foo;
Onde foo
está outra matriz de char
. Essa forma de inicialização funcionará apenas com literais de string.
EDITAR
Devo alterar isso para dizer que você também pode inicializar matrizes para conter uma string com um inicializador no estilo de matriz, como
char string[] = {'o', 'c', 't', 'o', 'b', 'e', 'r', 0};
ou
char string[] = {111, 99, 116, 111, 98, 101, 114, 0}; // assumes ASCII
mas é mais fácil para os olhos usar literais de string.
EDIT 2
Para atribuir o conteúdo de uma matriz fora de uma declaração, você precisará usar strcpy/strncpy
(para cadeias terminadas em 0) ou memcpy
(para qualquer outro tipo de matriz):
if (sizeof string > strlen("october"))
strcpy(string, "october");
ou
strncpy(string, "october", sizeof string); // only copies as many characters as will
// fit in the target buffer; 0 terminator
// may not be copied, but the buffer is
// uselessly completely zeroed if the
// string is shorter!