Ir para conteúdo

Invasão de memória de uma string sobre outra string


donutLukke

Posts Recomendados

Boa noite pessoal, gostaria da ajuda de vocês.

Estou fazendo um código que pega informações do usuário, coloca em uma AVL e depois passa os dados dessa AVL para um arquivo. O problema é que quando igualo ou sobreponho as posições da string nome[ ] em relação a string cpf[ ] (ambas da struct "stc_Aluno"), parece haver uma invasão de memória da string nome[ ] em cima da string cpf[ ].

Por exemplo: se uso...

#define CAID 10
#define CANOME 11
#define CACPF 12

typedef struct A
{
  char id[CAID];
  char nome[CANOME];
  char cpf[CACPF];
  struct A *esquerdo, *direito;
  short altura;
}stc_Aluno;

O código consegue detectar se o CPF digitado já está na lista de dados.

Já quando coloco assim...

#define CAID 10
#define CANOME 12
#define CACPF 12

typedef struct A
{
  char id[CAID];
  char nome[CANOME];
  char cpf[CACPF];
  struct A *esquerdo, *direito;
  short altura;
}stc_Aluno;

O código não consegue detectar se o CPF digitado já está na lista de dados.

Primeiro o código vai para a função de "idAluno", depois "nomeAluno" e por final a "cpfAluno". Dentro das funções "idAluno" e "cpfAluno", há a função "compareAluno", que é responsável por identificar se o dado digitado já está contido na nossa AVL. No primeiro aluno adicionado, o código roda corretamente, já quando insiro os dados do segundo aluno, no momento da comparação de cpfs, a função ignora se o "cpf" digitado e o "cpf" que está na AVL são iguais.

Vou deixar o link do código logo abaixo, pode fazer a modificação que achar necessária e se possível, coloque aqui nesse post, o que você usou para resolver o problema. https://replit.com/join/snrbwfcatk-lucasverissimo1

  • Agradecer 1
Link para o comentário
Compartilhar em outros sites

Opa, bem vindo à comunidade!

Me parece que a sua função compareAluno() tenta advinhar o que é para comparar (ID, nome ou CPF) através do tamanho da string. Isso é um problema porque tanto CANOME quanto CACPF expandem para 12, fazendo com a que na hora de comparar o CPF, a comparação do if na linha 346 retorne verdadeiro e o programa compare um CPF com um nome.

A propósito, qual o motivo de você utilizar char[] nos IDs? Se os IDs vão conter só números, podem ser do tipo int.

Abraço.

  • Agradecer 1
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Fernando Mercês disse:

Opa, bem vindo à comunidade!

Me parece que a sua função compareAluno() tenta advinhar o que é para comparar (ID, nome ou CPF) através do tamanho da string. Isso é um problema porque tanto CANOME quanto CACPF expandem para 12, fazendo com a que na hora de comparar o CPF, a comparação do if na linha 346 retorne verdadeiro e o programa compare um CPF com um nome.

A propósito, qual o motivo de você utilizar char[] nos IDs? Se os IDs vão conter só números, podem ser do tipo int.

Abraço.

Muito obrigado, algo tão óbvio e não consegui enxergar, muito paz para você e sua família.

  • Agradecer 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Fernando Mercês disse:

Opa, bem vindo à comunidade!

Me parece que a sua função compareAluno() tenta advinhar o que é para comparar (ID, nome ou CPF) através do tamanho da string. Isso é um problema porque tanto CANOME quanto CACPF expandem para 12, fazendo com a que na hora de comparar o CPF, a comparação do if na linha 346 retorne verdadeiro e o programa compare um CPF com um nome.

A propósito, qual o motivo de você utilizar char[] nos IDs? Se os IDs vão conter só números, podem ser do tipo int.

Abraço.

É que pensei na hipótese dos IDs serem identificadores que podem mudar, que podem um dia ter letras.

  • Agradecer 1
Link para o comentário
Compartilhar em outros sites

6 horas atrás, donutLukke disse:

Muito obrigado, algo tão óbvio e não consegui enxergar, muito paz para você e sua família.

Pra você e sua família também. 🙂

6 horas atrás, donutLukke disse:

É que pensei na hipótese dos IDs serem identificadores que podem mudar, que podem um dia ter letras.

Entendi. Bom, como exercício ok, mas em geral ID é numérico, até pela velocidade de comparação. 😉

Abraço!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...