Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

pabkil

Alocação dinâmica em C

Mensagens Recomendadas

pabkil

Olá pessoal, estou começando no assunto de alocação dinâmica na linguagem C, estou a dois dias no mesmo problema e não consigo identifica-lo de forma nenhuma, aí vai o código:

#include <stdio.h>

#include <stdlib.h>

#define max 100

int main(){

    struct end{

        char nome[max];

    }*p;



    int num, i = 0, j = 0;

    char c;

    scanf("%d",&num);



    p = malloc(num * sizeof(struct end));

    if(p == NULL){

        printf("Erro");

    }



    for(i = 0;i < num; i++){

            c = getchar();

            while(c != '\n'){

                p[i].nome[j] = c;

                j++;

            }

            p[i].nome[j] = '\0';

            j = 0;

            printf("Registro: %d\n",i);

            printf("Nome: %s\n",p[i].nome);

    }

    return 0;

}

No caso o objetivo do programa é alocar dinâmicamente memória para uma struct e depois selecionar o número de nomes a serem digitados, ao final tudo é impresso. A principio o código aparenta estar certo, mas ocorre de ele imprimir instantaneamente um nome não digitado ainda e segmentation fault...

Desde já agradeço a ajuda!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Diutsu

O ciclo while é um ciclo infinito, repara que estás sempre a incrementar o j, mas a condição de paragem está dependente de c que é constante.

E se correres o programa, reparas noutro problema: quando fazes c=getchar(); da 1ª vez ele vai-te buscar um \n ao buffer do teclado, e portanto essa 1ª iteração do for é desperdiçada.


XX SINFO - Semana Informática

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pabkil

Fiz correções indicadas:

for(i = 0;i < num; i++){
            if((c = getchar()) != \n){
               p[i].nome[j] = c;
               j++;
            }
            printf("Registro: %d\n",i+1);
            printf("Nome: %s\n",p[i].nome);
          }

Mas ainda está ocorrendo se não ler nem printar a posição 0 do vetor, e se tento pular por ela, tenho uma erro e o programa trava.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

O ciclo while é um ciclo infinito, repara que estás sempre a incrementar o j, mas a condição de paragem está dependente de c que é constante.

E se correres o programa, reparas noutro problema: quando fazes c=getchar(); da 1ª vez ele vai-te buscar um \n ao buffer do teclado, e portanto essa 1ª iteração do for é desperdiçada.

Fiz correções indicadas:

Não fizeste não


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Alem das sugestoes dadas anteriormente acrescenta o free() para evitar "memory leaks".

Outra sugestao: porque nao usas o fgets() e removes o ENTER em vez daquela confusao com o getchar()?


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pabkil

Agradeço a todas as sugestões! Já consegui solucionar, eu estava colocando o struct dentro da função main(), por este motivo a alocação não funcionava corretamente. Em minha última resposta copiei um código que fazia parte de outro programa, isso que dá ficar fazendo várias coisas ao mesmo tempo :) ...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.