Escolar Documentos
Profissional Documentos
Cultura Documentos
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
GPU
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
1
Ponteiros (revisão) Ponteiros (revisão)
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
2
Ponteiros & Alocação (2/2) Atenção aos Ponteiros !!!
! Apontar algo que já existe: ! Declarar um ponteiro somente aloca espaço para
int *ptr, var1, var2; guardar um endereço de memória - não aloca nenhum
var1 = 5; espaço a ser apontado.
ptr = &var1; ! As variáveis em C não são iniciadas, elas podem
var2 = *ptr; conter qualquer coisa.
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
3
Tabelas/Arrays (5/5) Segmentation Fault vs Bus Error?
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
4
Aritmética de Ponteiros (4/4) Representação ASCII the caracteres
! Podemos utilizar a aritmética de ponteiros para "caminhar" ! Os caracteres são
ao longo da memória: representados através
de bytes
! Existem várias
void copy(int *from, int *to, int n) { codificações: ASCII,
int i; unicode, etc
for (i=0; i<n; i++) { ! É tudo um questão de
*to++ = *from++; interpretação ...
} char a='A';
} a=a+3;
puts(&a);
O que aparece?
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
Endereços
for ( i=0; i<ROW_SIZE; i++) 3
{
for ( j=0; j<COL_SIZE; j++) {
int n = 0; Mat[i][j]=aux; 2
while (s[n] != 0) n++; aux++; 1
return n; }
} ... 0 Mat
0 1
! Um erro comum é esquecer de alocar um byte para o Mat = 2 3
terminador 4 5
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
! O C arruma um array bi-dimensional empilhando as linhas ! O nome de um array é um ponteiro para o primeiro
umas a seguir às outras. elemento da tabela (indíce 0).
! Um parâmetro tabela pode ser declarado como um
! O espaço total de memória ocupado é array ou um ponteiro.
ROW_SIZExCOL_SIZE
int strlen(char s[]) int strlen(char *s)
{ {
! Temos que: int n = 0; int n = 0;
Mat[2][1] é o mesmo que Mat[2*COL_SIZE+1] while (s[n] != 0) while (s[n] != 0)
n++; n++;
return n; return n;
} }
Pode ser escrito:
while (s[n])!
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
5
QUIZ - Aritmética de Ponteiros Concluindo …
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
LINGUAGEM C sizeof(ar) ⇒ 12
…bem como para arrays cujo tamanho é definido em run-time:
- ALOCAÇÃO DINÂMICA - int n = 3;!
int ar[n]; // Or: int ar[fun_that_returns_3()];!
sizeof(ar) ⇒ 12!
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
6
Alocação dinâmica de memória (4/4) Diferença súbtil entre arrays e ponteiros
! As seguintes acções fazem com que o seu programa "crash" ou void foo() {
se comporte estranhamente mais à frente. Estes dois erros são int *p, *q, x, a[1]; // a[] = {3} also works here
bugs MUITO MUITO difíceis de se apanhar, portanto atenção: p = (int *) malloc (sizeof(int));
q = &x;
free()ing a mesma zona de memória mais do que uma vez
chamar free() sobre algo que não foi devolvido por malloc() *p = 1; // p[0] would also work here
*q = 2; // q[0] would also work here
*a = 3; // a[0] would also work here
! O runtime não verifica este tipo de erros
A alocação de memória é tão crítica para o desempenho que printf("*p:%u, p:%u, &p:%u\n", *p, p, &p);
printf("*q:%u, q:%u, &q:%u\n", *q, q, &q);
simplesmente não há tempo para fazer estas verificações
printf("*a:%u, a:%u, &a:%u\n", *a, a, &a);
Assim, este tipo de erros faz com que as estruturas internas de }
gestão de memória sejam corrompidas 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 ...!
E o problema só se manifesta mais tarde numa zona de código que ...! ?!! 2?!! 3?!!
?! ! 32
52 1!
? ...!
não tem nada a ver …! p q x a! unnamed-malloc-space!
QUIZ QUIZ
SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11 SMP- MiEEC & AC-LEI - Ano Lectivo 2010/11
http://www.lysator.liu.se/c/bwk-tutor.html
http://www.allfreetutorials.com/content/view/16/33/ (vários
tutoriais)