PDA

View Full Version : [C] puntatori


trallallero
15-05-2007, 10:31
Ciao.
In una funzione del genere:

void prova( int* pCount, BYTE*** pppTest)
{
int i;

BYTE **pP = NULL;

*pCount = 10;

pP = (BYTE **)malloc( *pCount * sizeof(BYTE *) );

if ( ! pP )
puts( "error allocating memory 1"), exit(1);

for (i = 0; i < *pCount; i++)
{
pP[i] = (BYTE *)malloc( 128 * sizeof(BYTE) );

if ( !pP[i] )
puts("error allocating memory 2"), exit(1);

memset( pP[i], 0, 128 * sizeof(BYTE) );

sprintf(pP[i], "this is a test <%03i>", i );
}
*pppTest = pP;
return 0;
}


percheŽ non posso usare direttamente *pppTest anzicheŽ pP ?
CioeŽ, percheŽ devo dichiararmi un puntatore locale, allocare etc e poi alla fine assegnare lŽindirizzo a quello passato e non usare direttamente il puntatore che trovo nellŽindirizzo passato ?

EŽ un poŽ di giorni che lavoro con triplette *** e mi son perso un attimo :uh:

recoil
15-05-2007, 11:04
void prova(char ***ppp)
{
char **pp;
int i;

//pp = (char **) malloc(10 * sizeof(char *));
*ppp = (char **) malloc(10 * sizeof(char *));
for (i = 0; i < 10; i++)
{
(*ppp)[i] = malloc(4);
//pp[i] = malloc(4);
}
//*ppp = pp;
}


eccoti un esempio
vedi però come è brutto da vedere?
(*ppp)[i] non è bello, meglio un pp[i] insomma

trallallero
15-05-2007, 11:56
void prova(char ***ppp)
{
char **pp;
int i;

//pp = (char **) malloc(10 * sizeof(char *));
*ppp = (char **) malloc(10 * sizeof(char *));
for (i = 0; i < 10; i++)
{
(*ppp)[i] = malloc(4);
//pp[i] = malloc(4);
}
//*ppp = pp;
}


eccoti un esempio
vedi però come è brutto da vedere?
(*ppp)[i] non è bello, meglio un pp[i] insomma
ma che pirla! non mettevo le parentesi! :doh:

(*ppp) lo scrivevo *ppp[i]

penso che sia questo il problema percheŽ non vedo altre differenze.
grazie

EDIT: no, le ho tolte al tuo esempio e funziona lo stesso. ChissaŽcosa cacchio ho scritto :wtf:

EDIT2: riconfermo le parentesi, dal [I]main non chiamavo la tua funzione ma sempre la mia.
Ho tolto le parentesi dalla tua, la chiamo e crasha. VabbeŽ chiarito, grazie :)

RaouL_BennetH
15-05-2007, 12:04
piccola domanda:

ma è lecito scrivere:



*pCount = 10



??

trallallero
15-05-2007, 12:09
piccola domanda:

ma è lecito scrivere:



*pCount = 10



??

percheŽ no ?
il prototipo eŽ questo:
void prova( int* pCount, BYTE*** pppTest)
quindi pCount eŽ un puntatore.
La funzione chiamante passa quindi lŽindirizzo della variabile dove la funzione chiamata andraŽ a scrivere.
se scrivi pCount = 10 (a parte che ricevi come minimo un warning) stai assegnando lŽindirizzo 10 al puntatore.
Se scrivi *pCount = 10 stai assegnando 10 alla variabile in quellŽinidirzzo.

RaouL_BennetH
15-05-2007, 12:10
percheŽ no ?
il prototipo eŽ questo:
void prova( int* pCount, BYTE*** pppTest)
quindi pCount eŽ un puntatore.
La funzione chiamante passa quindi lŽindirizzo della variabile dove la funzione chiamata andraŽ a scrivere.
se scrivi pCount = 10 (a parte che ricevi come minimo un warning) stai assegnando lŽindirizzo 10 al puntatore.
Se scrivi *pCount = 10 stai assegnando 10 alla variabile in quellŽinidirzzo.

Ah, ok :) Grazie per la spiegazione.

RaouL.