Programação C

COMO USAR A FUNÇÃO MALLOC EM C

COMO USAR A FUNÇÃO MALLOC EM C
Malloc é uma função incorporada declarada no arquivo de cabeçalho . Mallocéo nome abreviado para 'alocação de memória' eéutilizado para alocar dinamicamente um único bloco grande de memória contígua de acordo com o tamanho especificado. Existem dois tipos de alocação de memória estática e dinâmica. A alocação de memória estática é feita em tempo de compilação e não muda em tempo de execução. A alocação de memória dinâmica está alocando memória em tempo de execução para isso; nós usamos malloc. Agora, o ponto é de onde essa memória está chegando, então todos os requisitos dinâmicos em C são atendidos a partir da memória heap. Basicamente, nosso aplicativo / programa terá 3 tipos de memória

  • A memória da pilha é local para cada método, e quando o método retorna, a pilha o limpa automaticamente.
  • A área de memória global aloca memória para todas as variáveis ​​globais. Esta área de memória é criada no início do programa e, no final, limpa automaticamente a área de memória.
  • A memória heap é sempre inimiga de cumprir todos os requisitos dinâmicos do programa / aplicativo. Sempre que vamos usar a função malloc, ela vai pegar emprestada alguma memória do heap e nos dar o ponteiro para ela.

Sintaxe:

A sintaxe de malloc é (void *) malloc (size_t size). Assim, a sintaxe diz que malloc requer um tamanho, ele retornará o ponteiro basicamente um ponteiro vazio e o tamanho t é definido em como um inteiro sem sinal. A função Malloc simplesmente aloca um bloco de memória de acordo com o tamanho especificado no heap, como você pode ver na sintaxe que o tamanho precisa ser especificado e, em caso de sucesso, retorna um ponteiro apontando para o primeiro byte da memória alocada, senão retorna NULL. Portanto, o trabalho do malloc é alocar memória em tempo de execução.

Por que void pointer:

Malloc não tem ideia do que está apontando; simplesmente significa que não sabe quais dados serão armazenados naquele local da memória. Ele meramente aloca a memória solicitada pelo usuário sem saber o tipo de dados a serem armazenados na memória. É por isso que está retornando um ponteiro vazio.

Malloc apenas aloca memória e, em seguida, é responsabilidade do usuário fazer o typecast para um tipo apropriado para que possa ser usado corretamente no programa. O apontador voidéum apontador que pode apontar qualquer tipo de dado malloc devolve um apontador void porque não sabe que tipo de dados irá ficar armazenado dentro dessa memória.

Aqui estamos pedindo a malloc para alocar 6 bytes de memória agora se for um sucesso malloc irá retornar um ponteiro void. Nesse caso, temos que fazer um typecast para um ponteiro de tipo inteiro porque queremos armazenar um inteiro naquela memória. Aqui malloc aloca 6 bytes de memória em um heap, e o endereço do primeiro byte é armazenado no ponteiro ptr.

Programa de exemplo:

Aqui está um programa de exemplo simples para entender o conceito de malloc de uma maneira adequada.

Aqui você pode ver com a função printf que estou pedindo ao usuário para inserir o número de inteiros. Declaramos duas variáveis ​​acima de i e n. A variável n é o local onde iremos armazenar o número inserido pelo usuário. Depois disso, temos a função malloc; queremos que o malloc aloque o tamanho equivalente ao tamanho de n inteiros. Estamos multiplicando size if int com n; isso nos dará o tamanho de n inteiros. Depois disso, malloc irá retornar um ponteiro void, e estamos convertendo-o em um ponteiro inteiro, e estamos armazenando o endereço dentro do ponteiro ptr. O Typecasting é importante porque é uma boa prática.

Agora, se o ponteiro contém NULL, significa que a memória não está disponível. Então, vamos simplesmente sair do programa com o status de falha de saída. Se este não for o caso, podemos facilmente executar o loop for a.

O loop será executado de 0 a n-1, e pediremos ao usuário para inserir um inteiro um por um todas as vezes. Dentro da função scanf, existe uma coisa escrita ptr + i, pois sabemos que ptr contém o endereço do primeiro byte de memória. Digamos que o endereço seja 1000 aqui i é igual a zero inicialmente, então 1000 + 0 é 1000 então dentro desse endereço nosso primeiro inteiro será armazenado e depois disso quando i se tornar 1 então 1000 + 1 que foi interpretado internamente como (1000) +1 * 4 se estou assumindo que o tamanho do inteiro é 4 bytes, e seria igual a 1004, então o próximo inteiro será armazenado dentro de 1004 localização. E isso vai continuar desta forma os endereços são como 1000, 1004, 1008 e assim por diante. Não estamos usando o "e" comercial antes de ptr + i porque ptr já está nos fornecendo o endereço quando escrevemos ptr, que é simplesmente um ponteiro e contém o endereço, não o valor, portanto, não há necessidade de colocar o "e" comercial antes dele, e este conceito deve ser claro.

Aqui neste loop, estamos simplesmente fazendo uma coisa: imprimindo todos os inteiros na tela; obviamente, estamos usando ptr + i, mas aqui, neste caso, estamos desreferenciando porque ptr + i representa um endereço, então precisamos desreferenciá-lo. Se i for igual a 0, será 1000 porque estamos assumindo que o primeiro endereço será 1000, então o estamos desreferenciando; obteremos o primeiro inteiro, então i igual a 1, e se tornará 1001, mas será interpretado como 1004 se o tamanho do inteiro for 4. Novamente. Estamos desreferenciando isso, então isso nos dará os 2WL inteiro. Desta forma, tudo funciona.

Então, este é basicamente um programa simples que pede aos usuários que insiram n inteiros, e então estamos simplesmente exibindo esses inteiros na tela. Depois de executar o programa, isso exibirá.

Primeiro, estamos pedindo ao usuário para inserir o número de inteiros e, em seguida, o usuário está inserindo os inteiros, e estamos simplesmente exibindo-os na tela.

Conclusão:

Não há nada de errado no programa acima, desde que o continuemos por um longo tempo aqui, estamos pegando memória emprestada do heap, mas nunca estamos retornando a memória de volta ao heap; isso só acontece no caso em que o programa / aplicativo para funcionar por uma longa duração, como 24 horas. Eles chamarão a função malloc novamente e, novamente, isso significa que toda vez que eles estão pegando emprestado memória do heap e nunca retornando, isso é programação ruim, então devemos escrever livremente (o endereço de memória que deve ser liberado) antes de retornar. Então, sempre que usar malloc grátis é importante. Então, usando malloc, nós conservamos memória, e malloc aloca memória tão grande quanto você pede.

Feliz alocação de memória dinamicamente!

WinMouse permite que você personalize e melhore o movimento do ponteiro do mouse no PC com Windows
Se você quiser melhorar as funções padrão do ponteiro do mouse, use um freeware WinMouse. Ele adiciona mais recursos para ajudá-lo a obter o máximo do...
O botão esquerdo do mouse não funciona no Windows 10
Se você estiver usando um mouse dedicado com seu laptop ou computador desktop, mas o o botão esquerdo do mouse não funciona no Windows 10/8/7 por algu...
O cursor pula ou se move aleatoriamente enquanto digita no Windows 10
Se você descobrir que o cursor do mouse pula ou se move por conta própria, de forma automática e aleatória ao digitar em um laptop ou computador com W...