Laço estranho

Laço estranho

por Vinicius Rezende -
Número de respostas: 2
Em meu programa, tenho o seguinte laço:

/* declarações */
Polinomio res, aux, auxp = p, auxq = q;
res = (Polinomio) malloc(sizeof (Termo));
res->prox = NULL;
aux = res;
/*declarações */

while(auxp->prox != NULL)
{
res->prox = cria_monomio(auxp->coef,auxp->exp);
/*res = res->prox;*/
auxp = auxp->prox;
}
break;

O objetivo desse laço é copiar para res o conteúdo de auxp; teoricamente, ele percorreria o laço e criaria células com o mesmo conteúdo de auxp (em res). No entanto, do jeito que está, eu copio apenas a última célula, se eu descomentar, entro num loop infinito.

Testei o valor de auxp para um polinômio (x^2), deveria haver um endereço de memória qualquer e auxp->prox ser 0. (o que ocorreu)
Contudo, se eu mandar imprimir o endereço de memória de auxp dentro do laço, ele percorre toda a minha memória.

Estou há umas três horas procurando o porquê disso, verifiquei todas as minhas outras funções que manipulam polinômios para ver se o 'NULL' sumia da última célula.

Em particular, se eu mandar imprimir o endereço de auxp e auxp->prox tanto dentro quanto fora do laço, obtenho (no momento inicial) o mesmo endereço, entretanto, no seguir do laço, obtenho um endereço qualquer e zero.

O mais assustador é que mesmo eu dando malloc, res fica com o mesmo endereço de memória de auxp.

Minha solução foi dar OUTRO malloc em res...
Em resposta à Vinicius Rezende

Re: Laço estranho

por Francisco de Melo Viríssimo -
/* declarações */
Polinomio res, aux, auxp = p, auxq = q;
res = (Polinomio) malloc(sizeof (Termo));
res->prox = NULL;
aux = res;
/*declarações */


while(auxp->prox != NULL)
{
res->prox = cria_monomio(auxp->coef,auxp->exp);
/*res = res->prox;*/
auxp = auxp->prox;
}
break;


--------

VInícius, você inicializou o res, mas não guardou valor nenhum nele (ou seja, a primeira célula está VAZIA). não entendi porque você aloca memória para o res. A sua função cria_monômio não faz isso (use-a para guardar o primeiro termo de auxp em res, ainda de fora do laço)? Lembre-se que o cliente não sabe que existe o mallocX.
O código em negrito está "certo", mas tome cuidado, pois você precisa copiar o primeiro termo de auxp (você começa copiando de auxp->prox).

Francisco

Em resposta à Francisco de Melo Viríssimo

Re: Laço estranho

por Vinicius Rezende -
Na verdade, isto está assim porque eu estou criando um polinômio com cabeça na função, para depois rebobiná-lo (usando aux) e devovê-lo sem cabeça.
Bem, descobri também que meu compilador está imprimindo coisas diferentes para o conteúdo de uma mesma variável... Ele provavelmente está quebrado.