PDA

Visualizza la versione completa : Puntatore a puntatore in C


moreno73
11-12-2003, 13:31
Ho un problema con i puntatori in C: se li uso per accedere ad array a 2 o pi dimensioni il compilatore non d problemi, ma il programma si interrompe durante l'esecuzione (in Linux mi da' "segmentation fault", in win 98 "il programma ha eseguito un'operazione non valida...", in win2003 si blocca).
Qualcuno potrebbe mandarmi il codice funzionante (non solo compilato senza errori)?
Ciao

#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>

int main() {
int **vet;
vet=(int **)malloc(sizeof(int)*5*2);
for (int i=0; i<5; i++) {
for (int j=0; j<2; j++) {
vet[i][j]=i+j;
printf("%i", vet[i][j]);
printf("\n");
}
}
free(vet);
return(0);
}

iguana13
11-12-2003, 16:03
Me perch in quel codice hai usato un puntatore a puntatore?
Non ce n'era bisogno! :confused:

infinitejustice
11-12-2003, 16:30
Allochi in maniera errata la memoria

**vet un puntatore puntatori, quindi i suoi elementi non sono int, ma puntatori a int.
Inoltre ogni elemento di **vet a sua volta un puntatore ad interi quindi deve essere mallocato

Questo un modo corretto per allocare un vettore di vettori m x n


int **vet, i, j;


vet = (int **)malloc(m*sizeof(int *))

for(i = 0; i < m; i++)
*(vet+i) = (int *) malloc(n*sizeof(int));

infinitejustice
11-12-2003, 16:33
p.s. all'interno del ciclo for potresti metterne un secondo per inizializzare tutti gli elementi, una cosa del tipo:

for(j = 0; j < n; j++)
*((*(vet+i))+j) = 10;


p.p.s. *((*(vet+i))+j) = vet[i][j], se ti abitui coi puntatori meglio ;)

moreno73
12-12-2003, 09:02
Ok, funziona, ma ho ancora un dubbio: la memoria allocata va liberata di volta in volta all'interno dei cicli:

free(*(vet+i));

oppure basta farlo alla fine:

free(vet);

?

Loading