Falha de segmentação [RESOLVIDO]

1. Falha de segmentação [RESOLVIDO]

Isabella
scherbatsky

(usa Ubuntu)

Enviado em 13/04/2012 - 13:23h

Eae galera, tô tentando fazer um programinha aqui mas estou com alguns problemas. Basicamente, o programa tem que pedir para que o usuário digite um nome com 5 caracteres, se não tiver 5, informar "digite um nome com 5 caracteres", e a mesma coisa para uma senha. Aí deve armazenar esse nome de usuario e senha, e depois quando o usuario digitar user/senha, exibir o "cadastro" dele.

Fiz a primeira parte da seguinte forma:
int main (){
int user (){
int tam;
char user[tam];
printf("\nDigite um nome de usuario com 5 caracteres:");
scanf ("%s", &user[tam]);
tam = strlen (user);

while (tam != 5){
printf("\nDigite um nome de usuario com 5 caracteres:");
scanf ("%s", &user[tam]);
tam = strlen (user);
if (tam = 5){
break;
} } }
return 0; }

Ele compila sem nenhum erro ou warning, mas quando vou executar aparece "Falha de Segmentação"... eu li que isso aparecia por algum problema de memoria (é isso mesmo?), mas como posso arrumar?
Obrigada


  


2. Re: Falha de segmentação [RESOLVIDO]

Bruno Rogério Fernandes
brunorf

(usa Arch Linux)

Enviado em 25/04/2012 - 08:36h

Aparentemente é um caso típico de buffer overflow. Acontece que você não faz qualquer verificação de limites na entrada de dados. Por exemplo:


scanf ("%s", &user[tam]);

Se o usuário entrar com um tamanho arbitrário de caracteres, pode estourar o buffer user, e sobrescrever o endereço de retorno da função.

Outro detalhe importante é que na sua função user() você declarou o vetor user como user[tam], e isso não deve ser feito em C. Assim, a fim de fazer o que você deseja, você deve fazer alocação dinâmica de memória, ou declarar o vetor user com um tamanho fixo:

alocação dinâmica:

#include <stdlib.h>
...

int tam = 20;
char *user = (char*)malloc(sizeof(char)*tam);

...


tamanho fixo:

...

char user[20];

...



3. Re: Falha de segmentação [RESOLVIDO]

Isabella
scherbatsky

(usa Ubuntu)

Enviado em 25/04/2012 - 10:14h

ah sim, entendi agora!
quando fiz esse exercicio, eu ainda não tinha aprendido alocação dinamica...
obrigada pela resposta :D






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts