paulo1205
(usa Ubuntu)
Enviado em 10/01/2013 - 01:13h
Vou reproduzir o seu código, enchendo-o de comentários, para você entender o que acontece.
Antes, porém uma explicação para você a respeito das variáveis que você declarou. As quatro variáveis (os arrays
a e
b e as variáveis simples
x e
c ) foram declaradas dentro do bloco (trecho de programa compreendido entre chaves "{" e "}") correspondente ao corpo da função
main (), o que significa que elas só são visíveis dentro desse bloco. Além disso, como essas declarações não incluem a palavra-chave
static , essas variáveis têm alocação automática, o que significa duas coisas: (1) que o compilador não reserva espaço para elas durante a compilação, mas tão somente gera instruções no código executável para que se abra espaço para elas em memória no momento em que o programa for executado, a cada vez que fluxo de execução passar pelo bloco no qual elas foram declaradas, e (2) que esse espaço será liberado quando acabar a execução desse bloco. Diferentemente do que acontecer para variáveis estáticas, o compilador C não dá qualquer garantia sobre o valor inicial de variáveis automáticas, a não ser que você especifique explicitamente tais valores no corpo do programa.
#include<stdio.h>
int main ()
{
/*
Neste ponto, você acabou de entrar na função main().
Ainda não foi aberto espaço na memória para as suas variáveis.
*/
char a[10],b[10],x;
int c;
/*
Neste ponto, o compilador já executou as instruções que reservam
uma área para seus dois arrays e suas duas outras variáveis, mas
ele apenas RESERVOU esse espaço, sem colocar coisa alguma dentro
dele nem se preocupar com o que pudesse haver antes.
*/
printf("Digite uma palavra:\n");
gets(a);
/*
Neste ponto (se o usuário não tiver sido maldoso e digitado mais
do que nove caracteres antes de apertar <Enter>) os elementos do
array 'a' terão recebido os valores correspondentes aos caracteres
digitados pelo usuário, mas os valores dos elementos de 'b', de
'x' e de 'c' ainda não são conhecidos.
*/
/*
No loop abaixo, c recebe sucessivamente, a cada iteração, os
valores de 0 a 9.
*/
for (c=0;c<10;c=c+1)
{
a[c]=x; /* Aqui você diz que o (c+1)-ésimo (digo 'c+1' porque o 1º
elemento tem índice 0, o 2º tem índice 1, e assim por
diante) de 'a' recebe o valor de 'x', mas qual o valor
de 'x' na primeira iteração, se em nenhum outro ponto
do programa executado até agora se atribuiu um valor
a 'x'?
*/
x=b[c]; /* Aqui você atribui um valor a 'x', tomado do (c+1)-ésimo
de 'b'. Só que -- pare para pensar -- nenhum elemento
de 'b' até agora tem um valor conhecido, porque 'b' não
recebeu nenhuma informação depois de ter tido espaço
automaticamente reservado para si, de modo que o valor
de 'x' só é trocado de algo desconhecido para outra
coisa também desconhecida!
*/
}
/*
Na prática, o que o loop acima faz é copiar os valores desconhecidos
de todos os elementos de 'b' por cima de o que quer que 'a' tenha
recebido com a execução de "gets(a)".
*/
/*
A impressão abaixo vai imprimir uma sequência imprevisível de
caracteres correspondente aos valores desconhecidos dos elementos
não-inicializados de 'b'. Com um pouco de "sorte", o programa pode
até travar, dar falha de segmentação ou outro sintoma "divertido",
caso não exista nenhum byte com valor nulo do início da região de
memória alocada automaticamente para 'b' até o final do segmento de
memória ocupado pela pilha do programa.
*/
printf("%s",b);
/*
Antes de sair do corpo da função haverá código para liberar a
memória que foi automaticamente reservada para 'a', 'b', 'x' e
'c'.
*/
return 0;
}