Gerenciamento de memória dinâmico de aplicativo avançado do Pointer

A melhor época para plantar uma árvore é há dez anos, seguida agora!

Não fale bobagem, vamos direto ao ponto!

Ao aprender arrays, só podemos definir primeiro um array de comprimento fixo, mas e quanto à situação real? Podemos fazer essa matriz não ser longa o suficiente devido à demanda. (O comprimento da matriz antes de c99 só pode ser uma constante especificada de antemão). A linguagem C indica a alocação dinâmica de memória. Usando a alocação de memória dinâmica, podemos projetar uma estrutura de dados que se expande ou encolhe de acordo com a demanda.

Um, função de alocação de memória dinâmica

Existem três funções de alocação de memória aqui. Elas são as três funções de malloc, calloc e realloc.

malloc-aloca bloco de memória, mas não inicializa o bloco de memória

calloc-alocar um bloco de memória e limpar o bloco de memória

realocar-ajustar o tamanho do bloco de memória alocado anteriormente

O protótipo da função de malloc: void * malloc (size_t size)

A mais comumente usada é a função malloc. Como a função malloc não precisa limpar o bloco de memória alocado, é mais eficiente do que a função calloc (acabei de digitar acidentalmente alta eficiência em uma palavra engraçada, haha ​​muito engraçado, hum, vamos continuar.)

Tipo de valor de retorno 1.malloc:

Como não sabemos que tipo de dados planejamos armazenar no bloco de memória, ele não retorna ponteiros inteiros ou comuns de tipos como char, mas sim ponteiros do tipo void * . O tipo void * refere-se a um ponteiro de "tipo universal".

Nota: Não execute operações aritméticas em ponteiros do tipo void * , como aritmética de ponteiro, movimento de ponteiro, etc., porque não sabemos que tipo de ponteiro é + 1 não sabemos quantos bytes são movidos.

2. Os parâmetros de malloc:

A função malloc aloca um bloco de memória de bytes de tamanho e retorna um ponteiro para o bloco de memória. Nota: O tipo de tamanho é um tipo inteiro sem sinal, normalmente apenas o tratamos como um inteiro comum (a menos que um bloco de memória muito grande esteja sendo alocado (/ dog)).

3. Ponteiro nulo:

O espaço de memória é limitado. Quando a função de alocação de memória é chamada, o espaço de memória é usado e um bloco de memória grande o suficiente não pode ser encontrado. Nesse momento, a função retorna um ponteiro nulo nulo. Um ponteiro nulo é um ponteiro que não aponta para lugar nenhum.

Portanto, depois de armazenar o valor de retorno da função na variável de ponteiro, precisamos determinar se a variável de ponteiro é um ponteiro nulo. Nesse caso, tome as medidas adequadas (geralmente printf é usado para solicitar algumas informações e exit (1) sai / retorna anormalmente para a chamada anterior, não há muito a dizer aqui).

2. Libere espaço de armazenamento

1. A memória dinâmica que solicitamos precisa ser liberada manualmente. Se malloc sempre se aplica a um bloco de memória após o outro, mas não o libera, isso levará ao esgotamento do heap (o bloco de memória obtido por malloc e outras funções de alocação de memória vem de um pool de armazenamento chamado heap), o que causará a função para retornar um ponteiro vazio.

Até mesmo o programa pode alocar blocos de memória e perder os registros desses blocos, desperdiçando espaço, como:

q = malloc(...);
p = malloc(...);
p = q;

p e q, respectivamente, apontam para diferentes blocos de memória (chamamos de bloco de memória P e bloco de memória Q), e p = q fornece o endereço de q ap, de modo que p também aponta para o bloco de memória Q, então o bloco de memória P torna-se um bloco de memória não registrado, embora o aplicativo tenha sido aplicado, mas o registro tenha sido perdido. Dessa forma, o bloco de memória inacessível é chamado de lixo, e a linguagem C não possui um mecanismo de coleta de lixo, o que significa que precisamos recuperar manualmente essa memória por nós mesmos!

2. O método é chamar a função free para liberar memória desnecessária.

O protótipo da função livre em <stdlib.h>:

void free (void * ptr);

Função: Libere o espaço de armazenamento apontado por ptr. O espaço liberado é geralmente enviado para o conjunto de armazenamento disponível, que pode ser redistribuído chamando as funções malloc, realloc e calloc posteriormente.

Basta passar o ponteiro para o bloco de memória que não é mais necessário para a função livre:

int *p;
int n = 5;
p = malloc(sizeof(int) * n);
free(p);

free libera o bloco de memória apontado por p, e então esse bloco de memória pode ser reutilizado por chamadas subsequentes à função malloc ou outras funções de alocação de memória. Nota: O parâmetro free deve ser o ponteiro retornado pela função de alocação de memória antes!

3. Ponteiro pendente

A função free (p) irá liberar o bloco de memória apontado por p, mas não mudará o próprio P. Se você esquecer que p não aponta mais para um bloco de memória válido, então ocorrerá um problema. Nesse caso, vários ponteiros apontam para o mesmo bloco de memória ao mesmo tempo e, depois que o bloco de memória é liberado, todos os ponteiros ficam vazios.

Tentar modificar ou acessar o bloco de memória liberado levará a um comportamento indefinido.Este é o risco potencial de ponteiros pendurados - acessar ou modificar o bloco de memória liberado sem nosso conhecimento pode levar a consequências sérias.

Três, array de alocação de memória dinâmica

Como mencionado anteriormente, é difícil estimar o tamanho do array quando escrevemos o programa e agora podemos resolvê-lo - array de alocação de memória dinâmica. Aloque espaço para a matriz durante a execução do programa e, a seguir, acesse a matriz por meio de um ponteiro para o primeiro elemento da matriz.

Use a função malloc para alocar espaço de armazenamento para a matriz

Assumindo que o programa que está sendo escrito requer uma matriz de n inteiros, n é calculado durante a execução de nosso programa, precisamos usar o operador sizeof para calcular o espaço necessário para cada elemento e, em seguida, multiplicar por n como a função malloc. Parâmetros para alocar espaço de armazenamento para este array. (Sempre use a função sizeof ao calcular a quantidade de espaço necessária para uma matriz! Por causa de possíveis diferenças do sistema, um inteiro do tipo int ocupa bytes diferentes, e sizeof pode melhorar a portabilidade do código.)

Uma vez que a aponta para um bloco de memória alocado dinamicamente, podemos ignorar o fato de que a é um ponteiro e usá-lo como o nome do array.Então, faça o que você quer fazer com este "array"!

 

 

Por favor, indique quaisquer erros, obrigado ~~

 

Acho que você gosta

Origin blog.csdn.net/qq_51182221/article/details/115145224
Recomendado
Clasificación