Oi pessoal, mais uma aula no curso de programação em C. Continuando no tema de ponteiros, dessa vez sobre uma das ferramentas mais úteis da linguagem C, a alocação dinâmica de memória. Dúvidas e sugestões, deixem nos comentários.
Não. Quando a função main acaba, o programa finaliza. Nesse momento, qualquer memória alocada pelo programa é desalocada pelo sistema operacional. Mas é uma boa prática acostumar a sempre liberar a memória.
Como eu digo no inicio do vídeo, quando um programa executa, ele possui 4 áreas de memória distintas alocadas para ele: uma pro código de máquina, uma pros dados estáticos (variáveis globais ou variáveis declaradas com a palavra reservada static. Essas variáveis nunca são desalocadas durante a execução e mantém o seu valor), uma pra pilha de execução e outra pra heap. Todas as variáveis locais que você declarar, estão sujeitas a alocação dinâmica diferente, uma alocação dinâmica feita pelo Sistema Operacional. Você não controla quando ela é alocada e desalocada. Ela é alocada quando a função é chamada e desalocada quando a função termina (por isso, variáveis locais perdem seu conteúdo depois que uma função termina). Logo, variáveis locais não precisam de free. A heap é a área de memória onde o programador pode alocar memória através do malloc e que ficará alocada até que o programador desaloque com free. Essa memória é independente da pilha, então ela permanece alocada até que o programa execute free. Entende a diferença? Só se usa free, com memória alocada na heap e só se aloca memória na heap usando malloc. As variáveis locais normais não podem ser desalocadas com free porque elas estão em outro lugar na memória, onde o comando free não possui controle.
Quando eu coloco _fpurge(stdin); nao consigo rodar o programa; Quando o faço: //_fpurge(stdin); não consigo inseir o 'Nome 0' só a partir 'Nome 1': Quantidade de strings: 5 Nome 0: Nome 1: goku Nome 2: brasil Nome 3: amazonas Nome 4: manaus goku brasil amazonas manaus
Tem certeza de que colocou antes de cada leitura de string? O grande problema é o " " vindo da leitura anterior, que deve ser removido de do arquivo "stdin". Você está lendo um número antes da primeira string e o enter desse número pode estar servindo de entrada pra sua primeira string. Se está usando fpurge (com dois underline), então está no Linux, certo? Isso é importante, porque não cheguei a testar se existe essa função no Windows e seu funcionamento.
eu dei deslike pq tentei acompanhar a aula e ir refazendo todo o codigo passo a passo mas como existe muitos cortes e a aula está acelerada, assim sendo impossível de acompanhar, o código aqui não rodou, deu mais de 20 erros, gostaria que aceitasse como um feed back positivo para melhorar mais as video aulas, leve em consideração criar exemplos mais simples, intuitivos e direto pois se eu estou aqui como tantos outros alunos é porque estamos com dificuldade neste assunto de alocação dinâmica, não crie algo muito complexo.
Eu verifiquei o vídeo e realmente tem um erro no primeiro código que escrevi (o de alocar um vetor de n números inteiros). O primeiro erro eu comento na edição, do cast (int*) necessário antes de malloc. O segundo erro está no if, porque esqueci de fechar o parêntese. Estou sempre tentando melhorar, mas é inevitável, eu acho, alguns erros passarem.
@@ProfessorRafaelIvo boa dia pode me ajudar no ponteiro e alocação dinâmica Um determinado paciente permaneceu internado em um hospital em um período de tempo. Durante sua internação vários procedimentos foram efetuados. Para cada procedimento, as seguintes informações foram armazenadas no sistema: • Nome do procedimento; • Valor do procedimento; • Tempo de execução do procedimento (em dias); #include #include float pacienteinfo (float *V, int procedimentos) { int i; float soma_procedimentos=0; for ( i=0; i< procedimentos; i++) { soma_procedimentos = soma_procedimentos + V[i]; } return soma_procedimentos / procedimentos; } int main () { int i, n; float *info; printf("Qual é o nome do paciente ? "); scanf("%d", &n); info = (float*)malloc(n*sizeof(float) ); if ( info == NULL ) { printf ("Não foi possível alocar a área desejada "); exit(1); } printf("*** Digitação dos dados da informação *** "); for (i=0; i