Não tenho certeza do que estará na matriz char após a inicialização das seguintes maneiras.
1. char buf[10] = "";
2. char buf[10] = " ";
3.char buf[10] = "a";
Para o caso 2, acho que buf[0]
deveria ser ' '
, buf[1]
deveria ser '\0'
e de buf[2]
para buf[9]
será conteúdo aleatório. Para o caso 3, acho que buf[0]
deveria ser 'a'
, buf[1]
deveria ser '\ 0', e de buf[2]
a buf[9]
terá conteúdo aleatório.
Isso está correto?
E para o caso 1, o que estará no buf
? buf[0] == '\0'
e de buf[1]
a buf[9]
será conteúdo aleatório?
char buf[10]; buf = "a";
se não compilar. - Experimente primeiro e, em seguida, copie / cole o seu código real na pergunta. Isso economiza muito trabalho para você e para todos os leitores de sua pergunta.Respostas:
Não é assim que você inicializa uma matriz, mas para:
A primeira declaração:
é equivalente a
A segunda declaração:
é equivalente a
A terceira declaração:
é equivalente a
Como você pode ver, nenhum conteúdo aleatório: se houver menos inicializadores, o restante do array é inicializado com
0
. Este é o caso mesmo se o array for declarado dentro de uma função.fonte
char
.0
e'\0
têm o mesmo valor.char buff[3] = "abcdefghijkl";
é inválido.char p3[5] = "String";
também é inválido.char p[6] = "String";
é válido e é o mesmo quechar p[6] = {'S', 't', 'r', 'i', 'n', 'g'};
.Edit: OP (ou um editor) silenciosamente mudou algumas das aspas simples na pergunta original para aspas duplas em algum ponto depois de ter fornecido esta resposta.
Seu código resultará em erros do compilador. Seu primeiro fragmento de código:
é duplamente ilegal. Primeiro, em C, não existe vazio
char
. Você pode usar aspas duplas para designar uma string vazia, como com:Isso lhe dará um ponteiro para uma
NUL
string, ou seja, uma string de um único caractere com apenas oNUL
caractere nela. Mas você não pode usar aspas simples sem nada dentro delas - isso é indefinido. Se você precisar designar oNUL
personagem, você deve especificá-lo:A barra invertida é necessária para remover a ambigüidade do caractere
'0'
.realiza a mesma coisa, mas o primeiro é um pouco menos ambíguo de se ler, eu acho.
Em segundo lugar, você não pode inicializar arrays após eles terem sido definidos.
declara e define o array. O identificador de matriz
buf
agora é um endereço na memória e você não pode alterar para onde osbuf
pontos por meio de atribuição. assimé ilegal. Seu segundo e terceiro fragmentos de código são ilegais por esse motivo.
Para inicializar um array, você deve fazer isso no momento da definição:
fornecerá um array de 10 caracteres com o primeiro caractere sendo o espaço
'\040'
e o restante sendoNUL
, ou seja'\0'
,. Quando uma matriz é declarada e definida com um inicializador, os elementos da matriz (se houver) após aqueles com os valores iniciais especificados são automaticamente preenchidos com0
. Não haverá nenhum "conteúdo aleatório".Se você declarar e definir a matriz, mas não inicializá-la, como a seguir:
você terá conteúdo aleatório em todos os elementos.
fonte
Estes são equivalentes
Estes são equivalentes
Estes são equivalentes
fonte
A parte relevante do rascunho da norma C11 n1570 6.7.9 inicialização diz:
e
Assim, o '\ 0' é anexado, se houver espaço suficiente , e os caracteres restantes são inicializados com o valor que um
static char c;
seria inicializado dentro de uma função.Finalmente,
Portanto,
char
sendo um tipo aritmético, o restante da matriz também tem a garantia de ser inicializado com zeros.fonte
Curiosamente, é possível inicializar arrays de qualquer maneira e a qualquer momento no programa, desde que sejam membros de um
struct
ouunion
.Programa de exemplo:
fonte
Não tenho certeza, mas normalmente inicializo uma matriz para "", nesse caso, não preciso me preocupar com a extremidade nula da string.
fonte
main()
(e também deve usarvoid
, isto éint main(void) { ... }
,. C99 se livrou desta regra, então este código não irá compilar para C99 e posteriores. A outra coisa a notar aqui é que começando com C99, se você omitirreturn
em main, há um automáticoreturn 0;
colocado / implícito antes}
do final do main. Você está fazendo uso da regra int implícita que só funciona antes de C99, mas está fazendo uso do implícitoreturn
que só funciona com C99 e posteriores ; essas duas são obviamente contraditórias .