[CAPÍTULO 1] - [CAPÍTULO 2] - [CAPÍTULO 3]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6] - [PARTE 7]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6] - [PARTE 7]
Alocação Dinâmica
Definição
ALOCAÇÃO DINÂMICA é o processo através do qual um programa pode criar novas variáveis (áreas de memória) em tempo de execução.Variáveis alocadas dinâmicamente são criadas em uma área de memória livre chamada de HEAP e são acessadas através de PONTEIROS.
Funções de Alocação Dinâmica em C
Padrão ANSI
-
#include <stdlib.h>-
void * calloc(size_t num, size_t size);- Aloca uma quantidade de memória igual a
num*size. Isto é, aloca memória suficiente para um ARRANJO denumVARIÁVEIS de tamanhosize. - Devolve o endereço para o primeiro byte da região alocada. Se não houver memória suficiente para satisfazer a solicitação, é devolvido
NULL(endereço nulo).
- Aloca uma quantidade de memória igual a
-
void * malloc(size_t size);- Aloca uma quantidade de memória igual a
size. Isto é, aloca memória suficiente para uma VARIÁVEL de tamanhosize. - Devolve o endereço para o primeiro byte da região alocada. Se não houver memória suficiente para satisfazer a solicitação, é devolvido
NULL(endereço nulo).
- Aloca uma quantidade de memória igual a
-
void * realloc(void * ptr, size_t size);- Modifica o tamanho da memória previamente alocada apontada por
ptrpara um novo tamanho especificado porsize. O valorsizepode ser maior ou menor que o original. - Retorna o endereço para o primeiro byte da região de memória redimensionada. Se não houver memória suficiente no HEAP para satisfazer a solicitação, é devolvido NULL (endereço nulo) e o endereço originalmente em
ptré deixado inalterado.
- Modifica o tamanho da memória previamente alocada apontada por
-
void free(void * ptr);- Devolve ao HEAP a memória apontada por
ptr, tornando a memória disponível para alocação futura. - Deve ser chamada somente com um PONTEIRO
ptrcujo endereço de memória foi previamente alocado por meio de uma das funções do sistema de alocação dinâmica (calloc(), malloc(), realloc()).
- Devolve ao HEAP a memória apontada por
-
Outras
-
#include <string.h>-
char * strdup(const char * pstr);- Duplica a STRING apontada por
pstr. Ou seja, aloca no HEAPstrlen(pstr)+1bytes e copia a STRING começando empstrpara o endereço alocado. - Retorna o endereço alocado contendo uma cópia da STRING apontada por
pstrouNULLcaso não haja memória suficiente no HEAP.
- Duplica a STRING apontada por
-
Ex.: O trecho de código abaixo:
char str[] = "Teste"; char * pstr = strdup(str);É equivalente a:
char str[] = "Teste"; char * pstr = calloc(strlen(str) + 1, sizeof char); strcpy(pstr,str);
Atividade 1
Utilizando as funções de alocação dinâmica em C, iremos agora implementar uma segunda versão do programa lista de strings estudado na aula Ponteiros.list.h
/* list.h, Rev. 1.2 (c) 2007, Luciano R. Coutinho <lrc@deinf.ufma.br> Implements a list of strings. **/ #ifndef LIST_H #define LIST_H unsigned short list_size(void); void list_add(const char * str, unsigned short pos); char * list_rem(unsigned short pos); void list_set(const char * str, unsigned short pos); char * list_get(unsigned short pos); void list_print(void); #endif
list.c
/* list.c, Rev. 1.3
(c) 2007, Luciano R. Coutinho <lrc@deinf.ufma.br>
Implements a list of strings.
**/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "list.h"
#include "xcpt.h"
/** private data */
static char ** list;
static unsigned short size = 0;
static char xcpt_cmsg[XCPT_CMSG_MAX_SIZE+1];
/** public functions */
unsigned short list_size(void) {
return size;
}
/*
Add a new element str in the list at a given position pos.
From pos to the end of the list, all existing elements are
shifted right.
Throws:
INDEX_OUT_OF_BOUNDS_XCPT when pos is invalid ( > size +1 )
NULL_POINTER_XCPT when there is no memory available
to add a new element to the list.
**/
void list_add(const char * str, unsigned short pos) {
char * line = strdup(str);
sprintf(xcpt_cmsg,"%s, %d: list_ins (\"%s\",%d);",__FILE__,__LINE__,str,pos);
if ( line == NULL ) {
THROW(NULL_POINTER_XCPT,xcpt_cmsg);
return ;
}
if ( pos > size + 1 ) {
THROW(INDEX_OUT_OF_BOUNDS_XCPT,xcpt_cmsg);
return ;
}
if ( size % 10 == 0 ) {
char ** aux = (char **) realloc(list,(size + 10)*(sizeof (char**)));
if ( aux == NULL ) {
THROW(NULL_POINTER_XCPT,xcpt_cmsg);
return ;
}
list = aux;
}
if ( pos == 0 ) {
list[size] = line;
} else {
int i;
for ( i = size ; i >= pos; i-- )
list[i] = list[i-1];
list[i] = line;
}
size++;
}
char * list_rem(unsigned short pos) {
THROW(FUNCTION_NOT_IMPLEMENTED_XCPT,"list_rem();");
}
void list_set(const char * str, unsigned short pos) {
THROW(FUNCTION_NOT_IMPLEMENTED_XCPT,"list_set();");
}
char * list_get(unsigned short pos) {
THROW(FUNCTION_NOT_IMPLEMENTED_XCPT,"list_get();");
}
void list_print(void) {
int i;
for ( i=0; i < size; i++ )
printf("%2d: %s\n",i+1,list[i]);
}
Exercícios
- Conclua a Atividade 1 implementando as funções:
-
char * list_rem(unsigned short pos); -
void list_set(const char * str, unsigned short pos); -
char * list_get(unsigned short pos);
-
- Teste a nova implementação de
list.helist.ccom o mesmo arquivomain.capresentado na aula Ponteiros.
Bibliografia e fonte:
- [CCT] Schildt, H. (1996) C, completo e total: 3a Ed.. São Paulo, Makron.
- LP, UFMA; Coutinho, Lucian. Linguagem de programação para ciencia da computação da ufma.http://www.deinf.ufma.br/~lrc/2009.1/LP/
- [K&R] KERNIGHAN, B. e RITCHIE, D. (1990) C, a linguagem de programação: padrão ANSI. Rio de Janeiro: Campus.
- DEITEL, H. M. (1999) Como programar em C. Rio de Janeiro: LTC.
- Módulo Consultoria e Informática (1989) Linguagem C: programação e aplicações. Rio de Janeiro: LTC.
Coloque aqui o seu email