Vetores e Matrizes em C
Alocação estática de memória
• Ao se declarar uma variável qualquer, o compilador deixa reservado um espaço suficiente na memória para armazená-la
VETORES E STRINGS
int a; // 4 bytes float x; // 4 bytes double y; // 8 bytes char c; // 1 byte char *c;
// 4 bytes
Alocação estática de memória
• Ao fazer a alocação estática, apenas o espaço necessário na memória é reservado
• O conteúdo de cada posição não é alterado, e portanto uma variável apenas declarada pode conter qualquer coisa
• Inicializar as variáveis, atribuindo valores, antes do uso
– Inclusive vetores, matrizes e strings
Vetores
• A referência a uma posição de um vetor indica o cálculo de uma posição de memória a partir do início do vetor float x[1000];
// x[20] está na posição x + 20*sizeof(float)
• Na verdade, o símbolo x é um apontador para o início da região de memória reservada para o vetor
Vetores
• Quando se declara um vetor, o valor entre colchetes indica quantas vezes o espaço de memória necessário para o tipo básico será alocado char v[100]; //
100 * sizeof(char) = 100 bytes
int v[100]; // 100 * sizeof(int) = 400 bytes float vf[200]; // 200 * sizeof(float) = 800 bytes double z[1000]; // 1000 * sizeof(double) = 8000 bytes
Pode-se utilizar: sizeof(v)
Pode ser utilizado para descobrir o tamanho de uma string?
Vetores
• C NÃO AVISA NEM PRODUZ ERRO QUANDO O
LIMITE DE UM VETOR OU MATRIZ FOR
EXCEDIDO
float x[1000]; y = x[2000]; // não dá erro, mas vai acessar
// uma parte inesperada da memória
– Erro mais comum (runtime): segmentation fault
• É responsabilidade do programador verificar os limites, e garantir que não sejam excedidos
1
15/Mar/2012
Matrizes
Matrizes
= Vetores de mais de uma dimensão
• Na verdade, a alocação na memória é linear
• Muda apenas o cálculo da posição de memória do elemento referenciado int M[5][5];
...
M[0][0] = 15;
M[2][3] = 2; // posicao: M + (2*5 + 3)*sizeof(int)