Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luthien

Como alocar memoria de um campo de um ponteiro do tipo de uma struct

Recommended Posts

Eu tenho q ler o nome para o campo nome do ponteiro do tipo InfoFuncionais para a segunda celula de memoria e tenho q fazer a alocação do campo nome pq ele é um ponteiro. Pra reservar a segunda celula de memoria eu tenho q alocar usando aritmetica de ponteiros? Estou na duvida de como usar. Quando executo da erro na linha 37: " incompatible types when assigning to type 'TipoNome ' from type 'char *' ". Onde estou errando?

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

typedef struct nomes
{
    char *nome;
    char *sobrenome;
} TipoNome;

typedef struct data
{
    int dia;
    int mes;
    int ano;
} TipoData;

typedef struct documentos
{
    int cpf;
    TipoData data_nascimento;
} TipoDocumentos;

typedef struct info_funcionais
{
    TipoNome nome;
    TipoDocumentos doc;
    float salario;
} TipoInfoFuncionais;

int main()
{
    TipoInfoFuncionais* pont;

    pont = (TipoInfoFuncionais*)calloc(3,sizeof(TipoInfoFuncionais));

    (*(pont + 2)).nome = (char*)calloc(20,sizeof(char));

    printf("Informe o nome: ");
    fflsuh(stdin);
    fgets(info_funcionais.nome,20,stdin);

    printf("Nome: %s", info_funcionais.nome);
    return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue o mesmo princípio do seu outro tópico.

 

Alocação de memória para índice, depois para estruturas na quantidade de ponteiros declarados.

Nunca esquecendo de liberá-las no final.

    TipoInfoFuncionais **pont;
    unsigned int i;

    /* Alocação do índice */
    pont = malloc(sizeof(TipoInfoFuncionais *) * 3);
    for ( i = 0; i < 3; i++ )
    {
        /* Alocação da estrutura */
        pont[i] = malloc( sizeof(TipoInfoFuncionais) );
        /* Alocação para nome e sobrenome */
        pont[i]->nome.nome = malloc( sizeof(char) * 20 );
        pont[i]->nome.sobrenome = malloc( sizeof(char) * 20 );

        printf("Informe o nome: ");
        fscanf(stdin," %s %s", pont[i]->nome.nome, pont[i]->nome.sobrenome );
    }

    for ( i = 0; i < 3; i++ )
        printf("Nome: %s %s\n", pont[i]->nome.nome, pont[i]->nome.sobrenome);

    for ( i = 0; i < 3; i++ )
    {
        /* Libera nome e sobrenome */
        free(pont[i]->nome.nome);
        free(pont[i]->nome.sobrenome);
        /* Libera as estruturas "TipoInfoFuncionais" */
        free(pont[i]);
    }
    /* Libera o índice */
    free(pont);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho q criar um ponteiro do tipo InfoFuncionais e alocar tres celulas de memoria pra ele, dps tenho q ler o nome para o campo nome da segunda celula de memoria do ponteiro q criei. Eu consegui fazer dar certo mas sem alocar pra segunda celula de memoria, td vez q tento alocar o programa imprime <null>

 

Jeito q quase deu certo:

Só a quebra de linha q deu na hora de imprimir q eu n consegui arrumar... é pq quando digitei o nome, o programa leu o nome + o \n?

int main()
{
    TipoInfoFuncionais* pont;


    pont = (TipoInfoFuncionais*)calloc(3,sizeof(TipoInfoFuncionais));


    pont->nomes.nome = (char*)malloc(sizeof(char));
    pont->nomes.sobrenome = (char*)malloc(sizeof(char));


    printf("Informe o nome: ");
    fflush(stdin);
    fgets(pont->nomes.nome,20,stdin);


    printf("Informe o sobrenome: ");
    fflush(stdin);
    fgets(pont->nomes.sobrenome,20,stdin);


    printf("Nome completo : %s %s", pont->nomes.nome, pont->nomes.sobrenome);


    free(pont->nomes.nome);
    free(pont->nomes.sobrenome);
    return 0;
}

Programa q retorna <null>

int main()
{
    TipoInfoFuncionais* pont;


    pont = (TipoInfoFuncionais*)calloc(3,sizeof(TipoInfoFuncionais));


    pont->nomes.nome = (char*)malloc(sizeof(char));
    pont->nomes.sobrenome = (char*)malloc(sizeof(char));


    printf("Informe o nome: ");
    fflush(stdin);
    fgets((*(pont+1)).nomes.nome,20,stdin);


    printf("Informe o sobrenome: ");
    fflush(stdin);
    fgets((*(pont+1)).nomes.sobrenome,20,stdin);


    printf("Nome completo : %s %s", (*(pont+1)).nomes.nome, (*(pont+1)).nomes.sobrenome);


    free((*(pont+1)).nomes.nome);
    free((*(pont+1)).nomes.sobrenome);
    return 0;
}

Não consigo nem digitar o nome/sobrenome, já imprime o <null> direto D:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha... Sugiro que preste mais atenção, principalmente quando se trabalha com ponteiros, sobretudo malloc ou qualquer um de seus derivados.

 

sizeof dá o tamanho em bytes duma variável, tipo et cetera...

 

Por sua vez malloc reserva n bytes, ou seja, uma variável do tipo char geralmente possui 1 byte ou 8 bits, porém outros tipos, como int ou void*, sempre possuem mais de um byte.

 

Quando se utiliza algo do tipo: malloc(sizeof(TIPO) * k). Deve-se ter em mente que sizeof(TIPO) dará o número de bytes de uma única variável e k multiplicará este número, id est, serão alocadas k variáveis de TIPO (isto é equivalente a: calloc(k, sizeof(TIPO)) ).

...
pont->nomes.nome = (char*)malloc(sizeof(char));
pont->nomes.sobrenome = (char*)malloc(sizeof(char));
...

Vendo este código está claro que será alocado o espaço para somente um caractere, contudo mais a frente você designa à função fgets ler 20 caracteres? Não há uma discrepância? Isto pode gerar uma falha de segmentação.

 

Além disso, o fato de não verificar se a função malloc retornou um ponteiro nulo é ainda mais preocupante, em programas que usam muito estas funções, penso que seja mais produtivo fazer uma subrotina visando tais correções.

 

Algo como:

#include <stdlib.h>

...

void* safe_malloc (size_t sz)
{
    void* pmem = malloc(sz);

    if(pmem == NULL)
    {
        perror("safe_malloc");
        abort();
    }

   return pmem;
}

Obs: Qualquer erro em minhas sugestões basta me avisar, peço desculpas se não fui útil, afinal não pude dedicar muito mais tempo para analisar suas dúvidas, entretanto não hesite em ser mais específica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.