Curso de Programação C | Alocação dinâmica de memória com a função MALLOC | Aula 197

แชร์
ฝัง
  • เผยแพร่เมื่อ 17 ก.ย. 2024
  • Dando continuidade ao nosso Curso de Programação com a Linguagem C, nesta aula vamos iniciar o estudo sobre alocação dinâmica de memória com a função MALLOC.
    Código disponível em: wagnergaspar.com/

ความคิดเห็น • 46

  • @cauabalbuenoarguelho9844
    @cauabalbuenoarguelho9844 4 หลายเดือนก่อน +2

    Que vídeo excepcional, sem comparação a tranquilidade que ele ensina e o quão fácil de entender fica. Parabéns pelo conteúdo🔥🔥

  • @anderson_efrens
    @anderson_efrens 6 หลายเดือนก่อน

    Cara que aula MASSA, top demais, muito obrigado por compartilhar seu conhecimento com a gente, ajuda demais!
    Que Deus abençoe 🙏🏽

  • @victoron5091
    @victoron5091 5 หลายเดือนก่อน

    muito bom essa aula. Explicação e didática que coloca a Estácio no chinelo

  • @AndreSilva-vh5qk
    @AndreSilva-vh5qk 3 ปีที่แล้ว +6

    Ótimo vídeo e excelente explicação , continue sempre com esse ótimo trabalho

  • @alexandreramalho9637
    @alexandreramalho9637 2 หลายเดือนก่อน

    o melhor!

  • @3stud0
    @3stud0 3 หลายเดือนก่อน

    Valeu pelas aulas!

  • @HelloErroDevs
    @HelloErroDevs 10 วันที่ผ่านมา +1

    Usem o ( free ) no final, para desalocar a memória, se não ela vai ficar lá sempre !! Ex: free(x);

  • @PopOfertas-ez2rg
    @PopOfertas-ez2rg 3 หลายเดือนก่อน

    excelente explicação!

  • @josianecarmosini7463
    @josianecarmosini7463 2 ปีที่แล้ว +4

    Perfeito! Obrigada!

  • @andersoncoelhoac8307
    @andersoncoelhoac8307 2 ปีที่แล้ว +1

    Professor Wagner Gaspar excelente aula como sempre.
    Parabéns pelo trabalho, didática impecável.

  • @luisfilipe3287
    @luisfilipe3287 3 หลายเดือนก่อน

    otima explicação

  • @adryeeel
    @adryeeel 3 ปีที่แล้ว +3

    Obrigado mestre!

  • @prof.eleudson
    @prof.eleudson 9 หลายเดือนก่อน +1

    Parabéns pelos vídeos bastante didáticos. Sugestão: melhorar o contraste do tema no editor de texto e aumentar a fonte da letra para melhorar a leitura.

  • @rique0601
    @rique0601 10 หลายเดือนก่อน

    Excelente aula, professor!

  • @ediaateacher873
    @ediaateacher873 2 ปีที่แล้ว

    Muito bom! Esclareceu muita coisa! Obrigada por compartilhar aqui!

  • @zsoares3105
    @zsoares3105 2 ปีที่แล้ว +4

    Professor, muito boa aula, como sempre.
    No livro do André Backes Linguagem C Completa e Descomplicada ele ensina essa parte de alocação dinâmica sempre usando type cast. Nesse video vc não usou. Minha dúvida é: é realmente necessário utilizar o type cast para alocação dinâmica?

    • @programeseufuturo
      @programeseufuturo  2 ปีที่แล้ว +2

      Olá Soares.
      Nas versões mais antigas de C era necessário sempre faz um cast (uma espṕecie de conversão) de toda memória alocada, assim:
      (int) malloc(x0;
      (char) malloc(x);
      Nas versões mais recentes isso não é mais necessário.

  • @thiagaodavez5465
    @thiagaodavez5465 ปีที่แล้ว

    exceclente

  • @3stud0
    @3stud0 3 หลายเดือนก่อน

    Nesse caso não precisa declarar uma variável inteira que não seja ponteiro? O espaço alocado pelo malloc está fazendo o papel que essa variável faria caso o ponteiro apontasse para o endereço dela?

  • @antonnelly
    @antonnelly 5 หลายเดือนก่อน

    Saindo um pouco do foco do malloc e voltando para a parte de lógica, eu não entendi porque o if(x) retorna true se o conteúdo de x é um endereço de memória, que é algo diferente de zero e tudo que é diferente de zero é considerado false. Tudo bem o NULL ser considerado false e alterar o fluxo do programa para o else, mas o if(x) ser true deu nó no juízo. Alguém me ajude, por favor.

    • @marcofilho8778
      @marcofilho8778 5 หลายเดือนก่อน

      Nessa questão na linguagem C, quando compara o if(x), ele não está comparando o conteúdo da variável e sim o valor apontado pelo ponteiro X, que seria o endereço da memória. Se o ponteiro for nulo, o endereço de X não vai "existir" o que vai retornar o erro de alocação. Já quando a alocação acontecer, o X vai apontar o endereço de memória, indicando que conseguiu alocar os bytes... é um pouco confuso mas espero ter sanado a sua dúvida

  • @silverplays_br4912
    @silverplays_br4912 2 ปีที่แล้ว +2

    quando eu uso a função malloc( ); por ex:
    int *a;
    a = malloc(30);
    e depois uso sizeof(a);
    continua retornando 4

    • @xdzn3765
      @xdzn3765 2 ปีที่แล้ว +2

      Simples, vc está lendo o tamanho de um ponteiro, e não dos blocos que você alocou. Lembre-se que o conteúdo de "a" é um endereço de memória. Porém, msm se vc ler o tamanho de (*a), resultará em 4 bytes. Tipos inteiros vão ter 4 bytes independente do q vc fizer. Oq vc fez foi alocar 30 bytes, porém, vc está utilizando um int* (ponteiro para inteiros) para interagir com esses 30 bytes, logo, ele vai ler esses bytes como inteiros e, como eu disse, só possuem 4 bytes.

    • @programeseufuturo
      @programeseufuturo  2 ปีที่แล้ว +3

      Olá Silver.
      É exatamente isso que o dzn disse.
      Quando você faz sizeof(a), você está buscando o tamanho da variável a, que é um ponteiro. Esse ponteiro "aponta" para uma região com 30 bytes de memória. Perceba que a memória alocada e o tamanho do seu ponteiro são coisas diferentes.
      O curioso é ter dado 4 bytes aí na sua máquina. Um ponteiro na maioria das arquiteturas modernas ocupa 8 bytes de memória.

    • @programeseufuturo
      @programeseufuturo  2 ปีที่แล้ว +1

      Obrigado pelo ajuda dzn.

    • @xdzn3765
      @xdzn3765 2 ปีที่แล้ว +4

      @@programeseufuturo Disponha. Achei muito top a sua playlist, é uma das mais completas sobre linguagem c atualmente, ótimo conteúdo!

  • @erickporto5667
    @erickporto5667 ปีที่แล้ว

    me fale se estou errado mas acho que internamente o malloc funciona assim:
    void *memoryalloc(size_t size){
    void *v = size;
    return v;
    }

  • @israels.santos8556
    @israels.santos8556 2 ปีที่แล้ว

    Boa noite... Professor... preciso de ajuda... estou travado aqui buscando entender essa função malloc... até agora não conseguir entender essa função...
    tipo: Em todas as aulas vcs falam que a função malloc retorna um ponteiro... mais qual nome desse ponteiro? e como assim esse ponteiro é armazenado na variável? qual?
    Outra: minha maior questão é a seguinte
    se eu declaro uma variável: int x; estou dizendo que preciso de 4 bytes para essa variável certo?!
    se eu usar a função malloc então vou dizer que preciso alocar espaço por exemplo para uma variavel do tipo int ou seja 4 bytes... que dá na mesma coisa de antes...
    Isso que não consegui entender.
    Nenhum vídeo até agora que vi aqui no youtube explica essa função direito.
    por exemplo, os seus vídeos anteriores sobre ponteiros, estruturas, etc... todos conseguir entender... e vc ensinou de forma bem clara.
    já aqui não fez isso... por exemplo: não falou sobre a função malloc retornar um ponteiro do tipo void.
    Agora estou cada vez mais perdido...
    E não vou conseguir continuar... pois não posso sair desse conteúdo de estudos sem aprender.
    Se puder me ajudar ou alguém aqui vendo esse comentário, pode entrar em contato no meu zap: 098991857464
    Pago pela ajuda...

    • @programeseufuturo
      @programeseufuturo  2 ปีที่แล้ว +4

      Olá Israel.
      Pelas dúvidas que você apresentou eu dirigia que o problema não está no conteúdo de ponteiros mas em uma introdução a programação não bem feita. Vamos lá:
      1) "Em todas as aulas vcs falam que a função malloc retorna um ponteiro... mais qual nome desse ponteiro?"
      Respota: Essa dúvida por exemplo é sobre criação de variáveis. Observe a linha a seguir:
      int *x = malloc(sizeof(int));
      O nome do ponteiro é x.
      X é a variável que vai receber o endereço de memória retornado pela função malloc. Então, respondendo sua pergunta, o nome desse ponteiro é o nome que você der para a variável que recebe o retorno da função malloc.
      2) "... e como assim esse ponteiro é armazenado na variável? qual?"
      Resposta: novamente conteúdo sobre criação de variáveis. Como atribuímos um valor a uma variável?
      A variável fica a esquerda e o valor atribuído fica a direita, assim:
      int idade = 25;
      A variável idade (a esquerda do sinal de atribuição) está recebendo o valor 25 (que está a direita do sinal de atribuição). Esse valor pode vir de uma função. Em vários exemplos geramos números com a função rand(), assim:
      int valor = rand();
      A função rand gera um valor que é retornado e atribuído a variável valor.
      Com um ponteiro é exatamente a mesma coisa:
      int *x = malloc(sizeof(int));
      A função malloc vai separar uma região de memória e vai retornar o endereço dessa região de memória. Esse retorno será salvo na variável a esquerda, neste caso a variável x, que é do tipo ponteiro, por isso o *.
      3) "minha maior questão é a seguinte
      se eu declaro uma variável: int x; estou dizendo que preciso de 4 bytes para essa variável certo?! se eu usar a função malloc então vou dizer que preciso alocar espaço por exemplo para uma variavel do tipo int ou seja 4 bytes... que dá na mesma coisa de antes...
      Isso que não consegui entender."
      Resposta: Ok Israel, se você usar como exemplo apenas int, char ou float, ponteiro é desnecessário. Agora, monta para mim uma lista encadeada sem usar ponteiro!
      Se ponteiros existem é porque são necessários. Eu usei os tipos primitivos como exemplo porque são bem mais simples. Se você está tendo dificuldade de entender um ponteiro para inteiro, imagine a confusão que seria se eu já começasse o conteúdo de ponteiros com estruturas de dados mais avançadas como lista, onde eles são fundamentais.
      4) "não falou sobre a função malloc retornar um ponteiro do tipo void."
      Resposta: Sim, não falei porque não faz a menor diferença. Lá na década de 90 quando usava a função malloc era necessário inclusive fazer um casting, uma conversão, assim:
      int *x = (int) malloc(sizeof(int));
      A linguagem C evoluiu e hoje isso não é mais necessário.

  • @bsds2185
    @bsds2185 2 ปีที่แล้ว +2

    b = (int *) malloc (50) e se eu colocar assim ele vai reservar 50 bytes na mem?

    • @programeseufuturo
      @programeseufuturo  2 ปีที่แล้ว +1

      Sim, 50 bytes.

    • @bsds2185
      @bsds2185 2 ปีที่แล้ว +1

      @@programeseufuturo massa vlw o professor da gente n falou isso

    • @programeseufuturo
      @programeseufuturo  2 ปีที่แล้ว +1

      Por nada BS Ds.
      Apenas tenha atenção a um detalhe. Ao inserir um valor fixo, tipo 50, na função malloc, você está alocando 50 bytes de memória. Isso não significa que você consegue guardar aí 50 números inteiros, por exemplo, ok? Por isso normalmente há uma multiplicação da quantidade de elementos vezes o tamanho de cada elemento.

    • @bsds2185
      @bsds2185 2 ปีที่แล้ว +1

      @@programeseufuturo sim tipo a gente tá programando em C mas eu n gosto mto chatão

  • @carlossurkamp7763
    @carlossurkamp7763 2 ปีที่แล้ว +1

    Não entendi. Se você atribui um valor ao malloc n é mais fácil atribui em uma variável normal? qual o fundamento real do malloc ?fiquei é mais confuso.

    • @programeseufuturo
      @programeseufuturo  2 ปีที่แล้ว +3

      Opa opa.
      "Se você atribui um valor ao malloc ..." Não há atribuição à malloc Carlos. Malloc é uma função.
      "qual o fundamento real do malloc ?" Como eu disse malloc é uma função com o objetivo de alocar memória para seu programa.
      Você passou pela parte de vetores e matrizes aqui do curso? Como foi apresentado, arrays são estruturas de dados com tamanho fixo. Na grande maioria das vezes são necessárias estruturas de dados dinâmicas, que crescem enquanto vão recebendo inserções, como listas, pilhas, filas, árvores.... Estas estruturas são criadas por meio de alocação dinâmica de memória e essa alocação dinâmica de memória é feita com as funções de alocação de memória como malloc e calloc.

  • @carencris8785
    @carencris8785 2 ปีที่แล้ว +1

    Professor, sabe por que está dando erro no meu programa, no codeblocks roda mas no Dev c++ fala que a conversão é inválida de void para contato, da erro nas linhas de locação dinâmica...#include
    #include
    #include
    typedef struct{
    char nome[50];
    int dia, mes, ano;
    float conta;
    }Contato;
    void imprimir(Contato **c,int quant){
    int i;
    printf("
    \t\tLista de contatos:
    ");
    printf("\t------------------------------
    ");
    for(i=0;idia,c[i]->mes,c[i]->ano,c[i]->nome,c[i]->conta);
    }
    printf("\t------------------------------
    ");
    }
    int cadastrar_contato(Contato **c,int quant,int tam){
    if(quantnome);
    printf("
    Digite a data de vencimento DD MM AAAA: ");
    scanf("%d%d%d",&novo->dia,&novo->mes,&novo->ano);
    getchar();
    printf("Digite o valor da conta: ");
    scanf("%f",&novo->conta);
    getchar();
    c[quant]= novo;
    return 1;
    }
    else{
    printf("impossivel novo cadastro.");
    return 0;
    }
    }
    void alterar_contato(Contato **c,int quant){
    int id;
    imprimir(c,quant);
    printf("
    \tDigite o codigo do contato que deseja alterar:
    ");
    scanf("%d",&id);
    getchar();
    id--;
    if(id >=0 && id < quant){
    Contato *novo = malloc(sizeof(Contato));
    printf("
    Digite o nome do conta: ");
    scanf("%50[^
    ]",novo->nome);
    printf("
    Digite a data de vencimento: DD MM AAAA: ");
    scanf("%d%d%d",&novo->dia,&novo->mes,&novo->ano);
    printf("Digite o valor: ");
    scanf("%f",&novo->conta);
    getchar();
    c[id]= novo;
    }
    else{
    printf("
    \tCodigo invalido!
    ");
    }
    }
    void salvar(Contato **c,int quant,char arq[]){
    FILE *file = fopen(arq,"w");//w para abrir para escrita...
    if(file){ //se file for diferente de NULL fazer tudo aqui dentro...
    // seria melhor uma lista engadiada, mas optei fazer com vetor para facilitar...
    //para salvar no arquivo quantos contatos temos em nosso vetor
    fprintf(file,"%d
    ",quant);//essa linha vai escrever no arquivo quantos registros serão salvos..escrever numero e saltar para linha seguinte!!!
    for(int i=0;inome,file);//para vetor de ponteiro usar -> no lugar de ponto para acessar a struct.
    fputc('
    ',file);//para pular uma linha
    fprintf(file, "%d %d %d %f
    ",c[i]->dia,c[i]->mes,c[i]->ano,c[i]->conta);
    }
    fclose(file); //fechar arquivo...
    }
    else{
    printf("
    \tNão foi possivel criar arquivo, verifique e tente novamente.
    ");
    }
    }
    int ler_arquivo(Contato **c,char arq[]){
    FILE *file = fopen(arq,"r");
    int quant = 0;
    Contato *novo = malloc(sizeof(Contato)); //alocação dinamica de memória.
    if(file){ //para verificar se arquivo abriu com sucesso!!
    fscanf(file,"%d
    ",&quant); //para saber quantas contas foram adicionadas.
    for(int i=0;inome,50,file); //leitura do nome, precisaria percorrer a linha até encontrar o
    ...fica para proxima "por isso optei pelo fscanf abaixo:"
    fscanf(file,"%50[^
    ]",novo->nome);//para não ocorrer a quebra de linha
    fscanf(file,"%d %d %d
    ",&novo->dia,&novo->mes,&novo->ano);//leitura da data
    fscanf(file,"%f",&novo->conta); //para ler valor da conta, fazer depois...
    c[i] = novo;//salvar nas posições do meu vetor...
    novo = malloc(sizeof(Contato));//nova alocação de memória..
    }
    fclose(file);
    }
    else{
    printf("NÃO FOI POSSIVEL ABRIR O ARQUIVO
    ");
    }
    return quant; //se arquivo for aberto com sucesso,teremos então um valor...
    }
    int main()
    { setlocale(LC_ALL,"portuguese");
    Contato *agenda[50];
    int tam = 50,quant = 0,opcao;
    char arquivo[] = {"agenda.txt"};
    do{
    printf("
    \t0 - Sair
    \t1 - Cadastrar
    \t2 - Alterar
    \t3 - Imprimir
    \t4 - Salvar
    \t5 - ler arquivo
    ");
    scanf("%d",&opcao);
    getchar();
    switch(opcao){
    case 1:
    quant +=cadastrar_contato(agenda,quant,tam);
    break;
    case 2:
    alterar_contato(agenda,quant);
    break;
    case 3:
    imprimir(agenda,quant);
    break;
    case 4:
    salvar(agenda,quant,arquivo);
    break;
    case 5:
    quant = ler_arquivo(agenda,arquivo);
    break;
    default:
    if(opcao !=0){
    printf("
    \tOpcao invalida!!!
    ");
    }
    }
    }while(opcao!=0);
    return 0;
    }

    • @programeseufuturo
      @programeseufuturo  2 ปีที่แล้ว

      Olá Caren. Tente descobrir qual compilador você está usando com o dev c++, pode ser isso.

  • @japereira1867
    @japereira1867 ปีที่แล้ว

    Uma dúvida: o que pode acontecer se um valor for atribuído ao endereço apontado pelo ponteiro x antes da alocação de memória? Ótimo vídeo!

    • @programadordehtml2484
      @programadordehtml2484 11 หลายเดือนก่อน +2

      Nesse caso o valor contido no ponteiro é um lixo de memória, ou seja, aponta para um endereço de memória aleatório que geralmente, ou não existe, ou já está sendo usada por outro programa.
      Isso resulta em um erro de execução.