Debug: "Uma violação de Acesso (Falta de Segmentação) ocorreu em seu programa." eim?

Debug: “Uma violação de Acesso (Falta de Segmentação) ocorreu em seu programa.”

Código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CLI 5
#define CON 10
int id = 0; // (fixo) ..cadastro
struct cliente {
    char nome[50];
    char nomes[5][15]; // nomes dinvididos ..strdiv
    int idade;
    char sr[4]; // tratamento ..cadastro
} cl[CLI];
struct conta {
	long int acesso[3]; // 1 conta. 2 senha. 3 n de contas.
	double saldo;
} ct[CON];
// funções
void strdiv() { // reparte cada nome
	int cont = 0, qn = 0, ch;
	for (ch = 0; ch < 80; ch++) {
		if (cl[id].nome[ch] != ' ') {
			cl[id].nomes[qn][cont] = cl[id].nome[ch];
			cont++;
		}
		else if (cl[id].nome[ch] == ' ') {
			cl[id].nomes[qn][cont] = '\0';
			cont = 0;
			qn++;
		}
		else { break; }
	}
}
void Cadastro() {
    int resp, acc;
    printf("\n=== Cadastrar === \n");
    printf("Nome: ");
    fflush(stdin); // sem isso, o programa passaria direto do fetos abaixo, e pediria somente a idade
    fgets(cl[id].nome, 49, stdin); // tentei o gets e depois li que dava problema em usa-lo, porém o problema persiste mesmo com fgets
    strdiv();
    do {
    	printf("Idade (+18): ");
    	scanf("%i", &cl[id].idade);
	} while (cl[id].idade < 18 || cl[id].idade > 150);
    printf("\nSexo: \n1 - Masculino \n2 - Feminino \n");
    do {
    	printf(">>> ");
    	scanf("%i", &resp);
    } while (resp < 1 || resp > 2);
    if (resp == 1) {
    	strcpy(cl[id].sr, "Sr.");
    } 
    else {
    	strcpy(cl[id].sr, "Sra.");
    }
	acc = id * 2;
	printf("\n...Cadastro completo... \n\n=== Criar conta === \n");
	Conta:
    printf("Conta (6 digitos): ");
    scanf("%li", ct[acc].acesso[0]); // o erro aparece qnt se entra com a conta, o programa simplesmente para de funcionar
    if (ct[acc].acesso[0] < 100000 || ct[acc].acesso[0] > 999999) goto Conta; // a conta deve ter 6 dígitos
    Senha:
    printf("Senha (6 digitos): ");
    scanf("%li", ct[acc].acesso[1]);
    if (ct[acc].acesso[1] < 100000 || ct[acc].acesso[1] > 999999) goto Senha; // a senha Tbm
    ct[id].saldo = 0;
	ct[acc].acesso[2] = 0;
}

(claro que isto é apenas uma parte do programa, coloquei apenas até onde dava o problema)
Onde errei?

[quote=Neviat]

Onde errei?[/quote]

Em escolher C como linguagem :lol:

[quote=Markus Alemao][quote=Neviat]

Onde errei?[/quote]

Em escolher C como linguagem :lol: [/quote]
:lol:
Não que eu queira programar em C, mas me recomendaram C para começar… :slight_smile:
Eu estava aprendendo Java antes de ir pra C, pode ter certeza que estou como muita saudade dele!

[quote=Neviat][quote=Markus Alemao][quote=Neviat]

Onde errei?[/quote]

Em escolher C como linguagem :lol: [/quote]
:lol:
Não que eu queira programar em C, mas me recomendaram C para começar… :slight_smile:
Eu estava aprendendo Java antes de ir pra C, pode ter certeza que estou como muita saudade dele![/quote]

Sim sim, eu estava brincando, realmente C é a base praticamente tudo, e é bastante interessante começar por essa linguagem.

Bons estudos :slight_smile:

Access Violation indica que você está tentando acessa uma posição de memória inválida. Isso ocorre, por exemplo, quando você tenta acessa um índice que não existe em um vetor, ou tenta ler um ponteiro nulo.
Estude o gdb, um utilitário que possibilita o debug de aplicações escritas em C. Ele te ajudará a ter um diagnóstico melhor do problema que fez a sua aplicação quebrar.

[quote=matheuslmota]Access Violation indica que você está tentando acessa uma posição de memória inválida. Isso ocorre, por exemplo, quando você tenta acessa um índice que não existe em um vetor, ou tenta ler um ponteiro nulo.
Estude o gdb, um utilitário que possibilita o debug de aplicações escritas em C. Ele te ajudará a ter um diagnóstico melhor do problema que fez a sua aplicação quebrar.[/quote]

Obrigado! Não encontrei nenhum erro desse tipo no código… =/
Vou procurar esse tal de gdb, vlw!

Carinha, na linha 59, to puxando da memória, mas o scanf pede o endereço da variável, e você está colocando direto o valor da variável. Acho que é isso que está gerando o access violation.

Carinha, na linha 59, to puxando da memória, mas o scanf pede o endereço da variável, e você está colocando direto o valor da variável. Acho que é isso que está gerando o access violation.

scanf("%li", ct[acc].acesso[0]); // o erro aparece qnt se entra com a conta, o programa simplesmente para de funcionar

ao invés faça isso:

scanf("%li", &ct[acc].acesso[0]);

[quote=abmpicoli]Carinha, na linha 59, to puxando da memória, mas o scanf pede o endereço da variável, e você está colocando direto o valor da variável. Acho que é isso que está gerando o access violation.

scanf("%li", ct[acc].acesso[0]); // o erro aparece qnt se entra com a conta, o programa simplesmente para de funcionar

ao invés faça isso:

scanf("%li", &ct[acc].acesso[0]);[/quote]

Segunda vez q crio um tópico no guj perguntando ql o problema em algum código q escreve e a resposta é q sqço se colocar o & no scanf! Vlw!!

Logo de inicio tente se acostumar com as boas práticas, então, não use “goto”.

Em C, não use goto “para trás” - todo goto para trás pode ser trocado por um do-while ou um while (dependendo do que você quer fazer.). No seu caso dois “do/while” já resolvem seu problema.
Não há problemas em adicionar labels se você acha que o seu programa fica mais claro.
Mas eles são sinais de que sua função está ficando muito comprida, ou seja, programação estilo “Linguiçaria do seu Gijo”.
Tente não ter mais de 60 linhas em uma única função.

Use goto “para frente” apenas no caso especial em que você precisa fazer um tratamento de erro excepcional e resolver seu problema com “if/then/else” não for possível, já que em C não há “try/catch”.

Obrigadopela ajuda galera! Vou tirar esses goto do código! Vlw!

Eu tenho,esmo que usar o fflush? Eu não sei ainda pra q serve ou qnd devo usa-lo, só coloquei ele pq recomendaram, pq sem ele, o programa n iria passar pelo gets, pedir logo a idade