GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Programa em C - [ERRO] "Programa.exe parou de funcionar."


#1

Olá Guj, tudo bem com os senhores?
Bem, eu tenho um projeto que utiliza listas em C, fiz o código inteiro, ele compila e tudo mais… Entretanto, após ele rodar, o programa simplesmente para de funcionar. Gostaria de pedir ajuda para identificar o erro no meu código. Desde já, forte abraço e obrigado.

Segue o código:

`#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>


struct lista{

int info;
struct lista* prox;

};

typedef struct lista Lista;

Lista* inicializa(void){

return NULL;

}

Lista* insere(Lista* l, int i){

Lista* novo = (Lista*)malloc(sizeof(Lista));
novo->info = i;
novo->prox = l;

return novo;

}

void imprime (Lista* x){

Lista* i;

for(i=x; i != NULL; x=x->prox)
    printf("%d ",x->info);

}




int main(){


Lista* j;

j=inicializa();
j=insere(j, 32);
j=insere(j, 53);
imprime(j);

system("Pause");

return 0;

}`

#2

Na função imprime, troca a condição do for de “i != NULL” para “x != NULL”


#3

void imprime (Lista* x){

for(; x != NULL; x = x->prox)
    printf("%d ",x->info);

}


#4

Valeu !!


#5

Sabe me dizer o porquê que na hora de compilar ele não deu erro ?


#6

É porque a condição gera um looping infinito.

Quando ele recebe o 32 e imprime, ele pega o próximo elemento e tenta imprimir. Como o elemento depois de 32 é nulo, gera um erro durante a execução do programa após tentar imprimir.

Exemplo:

void imprime (Lista* x){

Lista* i;

//for(i = x; i != NULL; x = x->prox)
//printf("%d ",x->info);

printf("%d ", x->info); //Imprime o 53.
x = x->prox; //Recebe o próximo (32).

printf("%d ", x->info); //Imprime o 32.
x = x->prox; //Recebe o próximo (NULL).

//Ele tenta imprimir, mas não há nada nessa posição!
printf("%d", x->info); 

}

Para corrigir, coloque esse último printf como comentário ou retire-o.


#7

Você também pode fazer o seguinte:

void imprime (Lista* x){

Lista* i;

for(i = x; i != NULL; i = i->prox)
printf("%d ",i->info);
}

É bem melhor.