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:
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
Postar um comentário
Obrigado pelo contato, retornarei o mais breve possível!