Escolar Documentos
Profissional Documentos
Cultura Documentos
int sizeof(tido_de_dado);
sizeof(tipo_de_dado)
sizeof variável
Exemplo sizeof()
#include <stdio.h>
#include <stdlib.h>
int main() {
int x;
float y;
printf("Qtde de bytes para CHAR: %d\n", sizeof(char));
printf("Qtde de bytes para INT: %d\n", sizeof(int));
printf("Qtde de bytes para FLOAT: %d\n", sizeof(float));
printf("Qtde de bytes para DOUBLE: %d\n", sizeof(double));
printf("Qtde de bytes para X: %d\n", sizeof x);
printf("Qtde de bytes para Y: %d\n", sizeof y);
return 0;
}
malloc()
• A função malloc() serve para alocar memória
durante a execução do programa. Ela recebe a
quantidade de bytes que será alocada, faz o pedido
de memória e retorna um ponteiro com o endereço do
inicio do espaço de memória alocado.
FORMA GERAL
• Entrada da função
– num: quantidade de bytes na memória a serem alocados
• Retorno da função
– NULL: Caso haja erro
– Ponteiro que aponta para a primeira posição de
memória alocada.
Exemplo I malloc()
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p, *p2;
//aloca memória para 1000 char
p = (char *) malloc(1000);
//aloca memória para 250 int
p2 = (int *) malloc(1000);
return 0;
}
Exemplo II malloc()
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p, i;
p = (int *) malloc(5 * sizeof (int));
if (p == NULL){
printf("Erro ao alocar memoria!");
exit(1);
}
for (i = 0; i < 5; i++){
p[i] = rand() % 10;
printf("%d\t", p[i]);
}
return 0;
}
calloc()
• A função calloc() aloca memória durante a execução
do programa e retorna um ponteiro com o endereço
da primeira posição de memória alocada, assim como
a função malloc().
FORMA GERAL
void *calloc(unsigned int num, unsigned int tamanho);
int main() {
int *p, i;
p = (int *) calloc(5, sizeof (int));
if (p == NULL){
printf("Erro ao alocar memoria!");
exit(1);
}
for (i = 0; i < 5; i++){
printf("%d\t", p[i]);
}
return 0; Saída
} 0 0 0 0 0
realloc()
• A função realloc() serve para alocar memória ou
realocar blocos de memória previamente alocados
pelas funções malloc(), calloc() ou realloc().
FORMA GERAL
void *realloc(void *ponteiro, unsigned int num);
• E retorna
– NULL, caso haja algum erro.
– O ponteiro para primeira posição do array
alocado/realocado.
Exemplo I realloc()
int *x, i;
x = (int *) malloc(40 * sizeof(int));
for (i = 0; i < 40; i++)
x[i] = rand() % 10;
x = (int *) realloc(x, 80 * sizeof(int));
x = (int *) realloc(x, 20 * sizeof(int));
x = (int *) realloc(x, 0);
Exemplo II realloc()
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
int *p = malloc(5 * sizeof(int));
for (i = 0; i < 5; i++){
p[i] = rand() % 9;
printf("%d\t", p[i]);
}
//diminuir tamanho do array
p = realloc(p, 3 * sizeof(int));
for (i = 0; i < 3; i++)
printf("%d\t", p[i]);
//aumenta o tamanho do array
p = realloc(p, 10 * sizeof(int));
for (i = 0; i < 10; i++)
printf("%d\t", p[i]);
return 0;
}
free()
• As funções vistas anteriormente servem para
alocar espaços de memória. Ao contrário
delas, a função free() irá liberar espaços
de memória alocados.
FORMA GERAL
void free(void *ponteiro);
int main() {
int *p, i;
p = (int *) malloc(5 * sizeof (int));
if (p == NULL){
printf("Erro ao alocar memoria!");
exit(1);
}
for (i = 0; i < 5; i++){
p[i] = rand() % 10;
printf("%d\t", p[i]);
}
free(p);
p = NULL;
return 0;
}
O que será impresso?
int a[10], *b;
b = a;
b[2] = 25;
printf("%d\n", a[2]);
printf("%d\n", b[2]);
printf("\n");
for (i = 0; i < 9; i++)
printf("%d ", v[i]);
return 0;
}
Alocação de arrays multidimensionais
• Sabendo que um array é uma sequência
adjacente de posições na memória, podemos
alocar espaço para uma matriz da mesma forma
que fazemos com um vetor, ou seja, alocar um
array de uma única dimensão e tratá-lo como
se fosse uma matriz (2 dimensões).
Exemplo:
int *p = (int *) malloc((4 * 4) * sizeof(int));
Alocação dinâmica de matrizes
#include <stdio.h>
Solução I
#include <stdlib.h>
int main() {
int i, j, lin, col, *p;
lin = 2;
col = 2;
p = (int *) malloc(lin * col * sizeof(int));
for (i = 0; i < lin; i++){
for (j = 0; j < col; j++)
p[i * col + j] = rand() % 10;
}
for (i = 0; i < lin; i++){
for (j = 0; j < col; j++)
printf("%d ", p[i * col + j]);
printf("\n\n");
}
free(p);
p = NULL;
return 0;
}
#include <stdio.h> Alocação dinâmica de matrizes
#include <stdlib.h>
void preencheMatriz(int *m, int lin, int col){ Solução I – com função
int i, j;
for (i = 0; i < lin; i++){
for (j = 0; j < col; j++)
m[i * col + j] = rand() % 10;
}
}
void imprimeMatriz(int *m, int lin, int col){
int i, j;
for (i = 0; i < lin; i++){
for (j = 0; j < col; j++)
printf("%d ", m[i * col + j]);
printf("\n\n");
}
}
int main() {
int lin, col, *matriz;
lin = 2;
col = 2;
free(matriz);
matriz = NULL;
return 0;
}
Alocação de arrays multidimensionais
• Se quisermos alocar um array com mais de uma
dimensão e manter a notação de colchetes
para cada dimensão, precisamos utilizar o
conceito de "ponteiro para ponteiro".
Exemplo: int **p;
Matriz na memória
#include <stdio.h> Alocação dinâmica de matrizes
#include <stdlib.h>
int main() { Solução II
int i, j, lin, col, **mat;
lin = col = 2;
m = calloc(l, sizeof(int));
for (i = 0; i < l; i++)
m[i] = calloc(c, sizeof(int));
return m;
}
int main() {
int **matriz;
matriz = (int **) geraMatriz(3,5);
}