Obra: Programar em C/Gerenciamento de memória
Matéria: Matemática
alocação dinâmica todos os dados de um programa são armazenados na memória do computador muito comum necessitar reservar um certo espaço na memória para poder guardar dados mais tarde por exemplo poderíamos reservar um espaço de bytes para guardar uma string que usuário viesse digitar declarando um vetor de caracteres se quiséssemos reservar um espaço que só conhecido no tempo de execução do programa se espaço fosse muito grande de modo que declarar vetores de tal tamanho seria inconveniente pois entre outras coisas aumenta sem necessidade tamanho do executável para solucionar esse problema existe alocação dinâmica de memória que como nome sugere uma maneira de alocar memória medida que programa vai sendo executado as quatro funções relacionadas com alocação dinâmica serão descritas seguir malloc free essas duas funções são as mais básicas para gerenciamento de memória malloc responsável pela alocação de um pedaço de memória free responsável por liberar esse pedaço de memória função malloc serve para alocar memória tem seguinte protótipo void malloc unsigned int num void free void ptr para alocar um espaço na memória precisamos fornecer função malloc número de bytes desejados ela aloca na memória retorna um ponteiro void para primeiro byte alocado ponteiro void pode ser atribuído qualquer tipo de ponteiro se não houver memória suficiente para alocar memória requisitada função malloc retorna um ponteiro nulo para saber tamanho do bloco alocar precisaremos usar operador sizeof ele permite também saber automaticamente tamanho de structs criadas pelo usuário veja um exemplo de alocação dinâmica include include int main int argc char argv ponteiro para memória que será alocada int int alocar elementos inteiros ou seja sizeof int int malloc sizeof int if null printf erro não foi possivel alocar memória exit for outros exemplos int main int malloc sizeof int printf printf int main int malloc sizeof int malloc sizeof int printf compilador aceita porque são ambos int compilador aceita também porque ambos são ponteiros apontam para mesmo tipo podemos simplificar malloc sizeof int por malloc mas como temos sistemas operacionais de bits primeira declaração torna as coisas mais portáveis calloc função calloc também serve para alocar memória mas possui um protótipo um pouco diferente void calloc size_t nelem size_t elsize função calloc reserva um bloco com tamanho nelem elsize octetos consecutivos isto aloca memória suficiente para um vetor de num objetos de tamanho size diferente de malloc bloco reservado inicializado essa função retorna um ponteiro void para primeiro byte alocado ponteiro void pode ser atribuído qualquer tipo de ponteiro se não houver memória suficiente para alocar memória requisitada função calloc retorna um ponteiro nulo exemplo include include para usar calloc int main int int int determina valor de em algum lugar calloc sizeof int aloca números inteiros pode agora ser tratado como um vetor com posicoes malloc sizeof int maneira equivalen
meros inteiros pode agora ser tratado como um vetor com posicoes malloc sizeof int maneira equivalente usando malloc if printf erro memoria insuficiente exit for no exemplo acima alocada memória suficiente para se colocar números inteiros operador sizeof retorna número de bytes de um inteiro ele útil para se saber tamanho de tipos ponteiro void que calloc retorna convertido para um int pelo cast atribuído declaração seguinte testa se operação foi bem sucedida se não tiver sido terá um valor nulo que fará com que retorne verdadeiro se operação tiver sido bem sucedida podemos usar vetor de inteiros alocados normalmente por exemplo indexando de realloc função realloc serve para realocar memória tem seguinte protótipo void realloc void ptr size_t size função realloc ajusta tamanho de um bloco size octetos consecutivos função modifica tamanho da memória previamente alocada com malloc calloc ou realloc apontada por ptr para tamanho especificado por size valor de size pode ser maior ou menor que original um ponteiro para bloco devolvido porque realloc pode precisar mover bloco para aumentar seu tamanho se isso ocorrer conteúdo do bloco antigo copiado no novo bloco bloco antigo liberado nenhuma informação perdida se não precisar mover valor retornado igual ptr se ptr for nulo função aloca size bytes devolve um ponteiro funcionando como malloc se size zero memória apontada por ptr liberada se não houver memória suficiente para alocação um ponteiro nulo devolvido bloco original deixado inalterado exemplo include include include int main char str null str null str char malloc strcpy str abcdefghij str char realloc str printf endereço de str str printf endereço de str str str char realloc str printf novo endereço de str str printf conteudo de str str free str free str return alocação dinâmica de vetores alocação dinâmica de vetores utiliza os conceitos aprendidos na aula sobre ponteiros as funções de alocação dinâmica apresentados um exemplo de implementação para vetor real fornecido seguir include include float int float ponteiro para vetor if alocação dinâmica de matrizes alocação dinâmica de memória para matrizes realizada da mesma forma que para vetores com diferença que teremos um ponteiro apontando para outro ponteiro que aponta para valor final ou seja um ponteiro para ponteiro que denominado indireção múltipla indireção múltipla pode ser levada qualquer dimensão desejada mas raramente necessário mais de um ponteiro para um ponteiro um exemplo de implementação para matriz real bidimensional fornecido seguir estrutura de dados utilizada neste exemplo composta por um vetor de ponteiros correspondendo ao primeiro índice da matriz sendo que cada ponteiro aponta para início de uma linha da matriz em cada linha existe um vetor alocado dinamicamente como descrito anteriormente compondo segundo índice da matriz include include float int int float ponteiro para matriz int variavel auxiliar if
matriz int variavel auxiliar if