Alocação dinâmica em C

MALLOC: Aloca um bloco de memória, mas não inicializa com 0 (zero).


int* pointer;
pointer = (int*) malloc(sizeof(int));
if (pointer == NULL) { 
    cerr << "ERROR: Out of memory\n"; 
    abort(); 
}

Observação: Uma variável int ocupa 4 bytes (32 bits).
sizeof (int):Retorna o tamanho em bytes ocupado por uma variável int (4 bytes).
malloc (4): Aloca 4 bytes consecutivos na memória e retorna o endereço em que o bloco foi alocado.
(int*): Converte o tipo retornado por malloc. Malloc retorna sempre um ponteiro genérico (void*). Logo precisamos converter o tipo desejado.

if (pointer == NULL)
Se o endereço retornado por malloc for "zero" (NULL), significa que não há espaço disponível na memória para alocar 4 bytes consecutivos (espaço necessário para uma variável int).


CALLOC: Aloca um bloco de memória já inicializando com 0 (zero).


int* pointer = NULL; 
pointer = (int*) calloc(1, sizeof(int)); 
if (pointer == NULL) { 
    cerr << "ERROR: Out of memory\n"; abort(); 

cout << *pointer << "\n"; 
(*pointer)++; 
cout << *pointer << "\n"; 
free(pointer); 

Calloc tem um argumento a mais, que é o a quantidade de blocos que serão alocados, sendo p argumento declarado antes de sizeof(int).
pointer = (int*) calloc(1, sizeof(int));

No momento que mandamos escrever na tela o 
cout << *pointer << "\n"; 
Ele já está inicializado com zero.



REALLOC: Permite realocar um novo bloco de memória, por exemplo quando o bloco atual não tem mais espaço suficiente.


int* intArray = NULL; //int array é um ponteiro constante para o 1° elemento do vetor
intArray = (int*) calloc(10, sizeof(int));    //inicializado com zeros
for (int i = 0; i < 10; i++) {
    cout << "Valor da posicao " << i << " = " << intArray[i] << "\n"; 


intArray = (int*) realloc(intArray, 15 * sizeof(int));   // +5 posições
for (int i = 0; i < 15; i++) { 
    cout << "Valor da posicao " << i << " = " << intArray[i] << "\n";  // as novas 5 posições terão valores aleatórios (o que estiver na memória, pois o realloc não inicializa com zeros que nem o calloc)

free(intArray); 

FREE: Libera um espaço de memória que não está sendo mais utilizado pelo programa.


int* pointer = NULL; 
pointer = (int*) malloc(sizeof(int)); 
*pointer = 10; 
(*pointer)++;
free (pointer)

O bloco de 4 bytes consecutivos alocado para a variável apontada por pointer é liberado.
A variável apontada por pointer não existe mais.
O bloco previamente alocado pode ser agora usado em outra chamada de malloc.
Se não liberarmos a memória, teremos um vazamento de memória (memory leaking).
Se pointer já for NULL, nada acontece .

IMPORTANTE: quando utilizar alocação dinâmica em C, deve-se sempre liberar a memória utilizado, pois se nao poderá haver um vazamento de memória.



TRABALHANDO COM MATRIZES:


Ponteiro para ponteiros
int** matrix = NULL; 
int rowLength = 5; // 5 linhas 
int colLength = 4; // 4 colunas 
matrix = (int**) malloc(sizeof(int) * rowLength); 
for (int row = 0; row < rowLength; row++) { 
    matrix[row] = (int *) malloc(sizeof(int) * colLength); 
    for (int col = 0; col < colLength; col++) { 
        matrix[row][col] = rand() % 100; 
    } 
for (int row = 0; row < rowLength; row++) { 
    for (int col = 0; col < colLength; col++) { 
        cout << "Matrix[" << row << ", " << col << "] = "; cout << matrix[row][col] << "\n"; 
    } 
free(matrix); 


Esse exemplo demonstra um ponteiro para ponteiros.


Comentários

Postagens mais visitadas deste blog

Método da Interpolação por Eliminação Gaussiana em Scilab

Cálculo do Erro para Interpolação em Scilab

Método de Interpolação de Lagrange em Scilab