Тёмный

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

Programe seu futuro
Подписаться 28 тыс.
Просмотров 24 тыс.
50% 1

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/

Опубликовано:

 

30 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 46   
@HelloErroDevs
@HelloErroDevs 23 дня назад
Usem o ( free ) no final, para desalocar a memória, se não ela vai ficar lá sempre !! Ex: free(x);
@cauabalbuenoarguelho9844
@cauabalbuenoarguelho9844 4 месяца назад
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🔥🔥
@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?
@AndreSilva-vh5qk
@AndreSilva-vh5qk 3 года назад
Ótimo vídeo e excelente explicação , continue sempre com esse ótimo trabalho
@programeseufuturo
@programeseufuturo 3 года назад
Obrigado André 😉
@antonnelly
@antonnelly 6 месяцев назад
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
@anderson_efrens
@anderson_efrens 7 месяцев назад
Cara que aula MASSA, top demais, muito obrigado por compartilhar seu conhecimento com a gente, ajuda demais! Que Deus abençoe 🙏🏽
@josianecarmosini7463
@josianecarmosini7463 2 года назад
Perfeito! Obrigada!
@programeseufuturo
@programeseufuturo 2 года назад
Por nada Josiane.
@zsoares3105
@zsoares3105 2 года назад
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 года назад
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.
@bsds2185
@bsds2185 2 года назад
b = (int *) malloc (50) e se eu colocar assim ele vai reservar 50 bytes na mem?
@programeseufuturo
@programeseufuturo 2 года назад
Sim, 50 bytes.
@bsds2185
@bsds2185 2 года назад
@@programeseufuturo massa vlw o professor da gente n falou isso
@programeseufuturo
@programeseufuturo 2 года назад
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 года назад
@@programeseufuturo sim tipo a gente tá programando em C mas eu n gosto mto chatão
@carencris8785
@carencris8785 2 года назад
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.
@silverplays_br4912
@silverplays_br4912 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 года назад
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 года назад
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 года назад
Obrigado pelo ajuda dzn.
@xdzn3765
@xdzn3765 2 года назад
@@programeseufuturo Disponha. Achei muito top a sua playlist, é uma das mais completas sobre linguagem c atualmente, ótimo conteúdo!
@carlossurkamp7763
@carlossurkamp7763 3 года назад
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 года назад
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.
@prof.eleudson
@prof.eleudson 10 месяцев назад
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.
@programeseufuturo
@programeseufuturo 10 месяцев назад
Opa, valeu prof :)
@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; }
@adryeeel
@adryeeel 3 года назад
Obrigado mestre!
@programeseufuturo
@programeseufuturo 3 года назад
Por nada 😉
@andersoncoelhoac8307
@andersoncoelhoac8307 2 года назад
Professor Wagner Gaspar excelente aula como sempre. Parabéns pelo trabalho, didática impecável.
@programeseufuturo
@programeseufuturo 2 года назад
Obrigado Anderson :)
@victoron5091
@victoron5091 5 месяцев назад
muito bom essa aula. Explicação e didática que coloca a Estácio no chinelo
@luisfilipe3287
@luisfilipe3287 4 месяца назад
otima explicação
@PopOfertas-ez2rg
@PopOfertas-ez2rg 4 месяца назад
excelente explicação!
@3stud0
@3stud0 3 месяца назад
Valeu pelas aulas!
@alexandreramalho9637
@alexandreramalho9637 2 месяца назад
o melhor!
@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 года назад
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.
@thiagaodavez5465
@thiagaodavez5465 Год назад
exceclente
@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 Год назад
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.
@ediaateacher873
@ediaateacher873 2 года назад
Muito bom! Esclareceu muita coisa! Obrigada por compartilhar aqui!
@rique0601
@rique0601 10 месяцев назад
Excelente aula, professor!
@programeseufuturo
@programeseufuturo 10 месяцев назад
Valeu Rique :)
Далее
Ко мне подкатил бармен
00:58
Просмотров 163 тыс.
Лайфак года 😂
00:12
Просмотров 92 тыс.
Programação em C - 14 - Alocação Dinâmica
13:16
Просмотров 15 тыс.
Alocação dinâmica: introdução a malloc e calloc
13:19
Aprenda ponteiros de uma vez por todas
10:40
Просмотров 6 тыс.
Alocacao Dinamica de Vetor Linguagem C
6:34
Просмотров 22 тыс.
Curso de C++ #39 - Alocação dinâmica de memória
17:16
Ко мне подкатил бармен
00:58
Просмотров 163 тыс.