[RESOLVIDO] Problema na execução do aplicativo

Tenho um problema com o executável programado em C. Quando o programa atinge uma determinada parte do código ele simplesmente para de funcionar (o windows pede para depurar o arquivo). Não sei o que fazer.

Segue o código:

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

struct carro{
	char* nome;
	char* cor;
	char* placa;
	int ano;
	int portas;
};

void cadastar(){
	struct carro c;
	c.nome = "Corolla";
	c.cor = "Azul";
	c.placa = "THI 3012";
	c.ano = 1996;
	c.portas = 4;
}

void exibir(){
	struct carro c;
	printf("%s", c.nome);
	printf("\n");
	printf("%s", c.cor);
	printf("\n");
	printf("%s", c.placa);
	printf("\n");
	printf("%i", c.ano);
	printf("\n");
	printf("%i", c.portas);
}

int main(){
	char* com;
	printf(">> ");
	scanf("%s", com);
	if(strcmp(com, "carro") == 0){ //Quando o executável chega nesta parte ele para de funcionar.
		cadastar();
		exibir();
	}else{
		printf(com);
		printf("\n");
		printf("err.");
	}
	getch();
	return 0;
}

Vamos lá ajudar você a resolver o problema, e entender o que está acontecendo no seu código.

No trecho:
char *com;

Substitua por:
char com[80];

Por que isso?
Bom, inicialmente você declarou um um ponteiro tipo char e este ponteiro esta apontando para um endereço de memória aleatório no seu computador. E você está tentando gravar nesse endereço aleatório. Explicando assim o travamento do programa.

Porém existe outro erro no seu programa: Quando você chama a função cadastrar(); o programa cria uma estrutura de dados tipo carro e atribui dados a ela, até nesta parte está ok.

Logo abaixo você chama a função exibir(); Nesta tem um problema. Você está declarando novamente a estrutura carro e esta tentando acessar dados que não estão carregados nela.

A struct declarada na função cadastrar(); é diferente da struct declarada na função exibir();

Se você quer acessar os dados da struct declarada na função cadastrar(); Ou você define ela como global (oque eu não recomendo) ou passe ela por referência na função.

As Funções ficariam assim:

void cadastar(struct carro *pCarro){
    pCarro->nome = "Corolla";
    pCarro->cor = "Azul";
    pCarro->placa = "THI 3012";
    pCarro->ano = 1996;
    pCarro->portas = 4;
}
void exibir(struct carro *pCarro){
    printf("%s", pCarro->nome);
    printf("\n");
    printf("%s", pCarro->cor);
    printf("\n");
    printf("%s", pCarro->placa);
    printf("\n");
    printf("%i", pCarro->ano);
    printf("\n");
    printf("%i", pCarro->portas);
}

No seu if seria assim:

if(strcmp(com, "carro") == 0) {
    struct carro c;
    cadastar(&c);
    exibir(&c);
}
else {
    /* ...  */
}

Qualquer dúvida poste que tentaremos ajudar.

1 curtida

Olá, eu sou nova no fórum e sou iniciante em C e C++ meu nível de conhecimento é acadêmico e você citou algo que me intrigou bastante e gerou um nó no meu pensamento. Não entendo de ponteiros mas até onde eu aprendi (char *com) declara uma string então na minha cabeça era para funcionar :sob: e testando o código postando com sua sugestão funcionou e gerou esse nó na minha cabeça. E porque você não recomenda variáveis globais?

Geralmente é considerado boa prática escrever código de maneira funcional, isto é, com funções em que a saída é determinada apenas pelos parâmetros de entrada, ao invés de depender de estado global.

1 curtida

Entendi, então é só questão de boas práticas mesmo. Muito obrigada.

Então Nadia, dê uma olhada neste post antigo por favor, nele você vai ter uma ideia melhor de como char* funciona.

Ponteiros costumam causar um pouco de confusão na cabeça de muitos programadores.

Sobre as variáveis globais e justamente o que o colega @pfk66 escreveu.

Dê uma pesquisada no link que coloquei e se houver dúvidas avise que tentaremos ajudar.

1 curtida

Muito obrigado, deu tudo certo aqui.