PDA

Visualizza la versione completa : [C] Malloc/Calloc/Realloc e strutture/funzioni...


fedrock
12-07-2014, 16:41
Bene, quindi alla fine l'allocazione dinamica serve (anche?) per salvare delle variabili/strutture/array (restituirle)... che vengono elaborate all'interno di una funzione, solo che dopo che questa viene eseguita tutto il contenuto di esse viene distrutto quindi grazie all'allocazione dinamica chiediamo dello spazio in memoria dove salvare quel contenuto in modo da evitare che venga distrutto dall'uscita della funzione e poi grazie ad un puntatore che punta al primo indirizzo di quello spazio che abbiamo allocato riusciamo a riprendere i dati e utilizzarli come meglio ci pare per poi eliminarli quando non ci servono liberando quello spazio allocato con free().
L'uso:

int *puntatore = malloc(6 * sizeof (int));
int *ptr = calloc(6,sizeof (int));
(6 elementi di tipo int)
La calloc pi lenta perch inizializza a zero gli elementi allocati mentre la malloc no ( questa l'unica differenza?)
Quando si alloca se l'allocazione non ha successo allora ritorna un NULL...
Questo tutto quello che sono riuscito a capire...

Ora voglio dunque provare a creare una funzione che mi restituisce una struttura, questo quello che ho provato a fare ma nulla le operazioni tra puntatori continuano a fregarmi 24268



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

typedef struct
{
int x;
int y;
}database;


int p(int n)
{
int i;
database *c;
c = malloc(n * sizeof(database));
for(i=0; i<n; i++)
{
&c[i].x = i;
&c[i].y = i + 1;
}
return c;
}



int main(int argc, char *argv[])
{
int *x = p(5);
int i;
for(i=0; i<5; i++)
{
printf("%d|%d\n", &x[i].x, &x[i].y);

}
return 0;
}


Cerco di leggermi qualcos'altro...

oregon
12-07-2014, 17:45
Ma se c giustamente un puntatore a struttura database, come mai la tua funzione restituisce un int ?

fedrock
12-07-2014, 21:49
Ma se c giustamente un puntatore a struttura database, come mai la tua funzione restituisce un int ?

Ora che guardo: hai ragione man, ma anche modificando quel dettaglio ci sono altri errori come per esempio l'assegnazione "&c[i].x = i" datemi un muro :dh:


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

typedef struct
{
int x;
int y;
}database;


int *p(int n)
{
int i;
database *c;
c = malloc(n * sizeof(database));
for(i=0; i<n; i++)
{
&c[i].x = i;
&c[i].y = i + 1;
}
return c;
}



int main(int argc, char *argv[])
{
int *x = p(5);
int i;
for(i=0; i<5; i++)
{
printf("%d|%d\n", x[i].x, x[i].y);

}
return 0;
}

shivi_php
12-07-2014, 22:29
scusa oregon se rispondo in questa discussione volevo chiederti una cosa ma quando usiamo malloc non necessario fare casting tipo (int*)malloc(sizeof(int)) o va bene anche senza casting grazie mille

oregon
13-07-2014, 01:50
Il casting obbligatorio con il C++ ma non con il C.

@fedrock ... se il puntatore di tipo

database *c;

se lo restituisci allora la funzione deve essere dello stesso tipo ovvero


database *p(int n)

e anche il puntatore restituito nel main deve essere dello stesso tipo


database *x = p(5);

Inoltre queste linee devono essere semplicemente


c[i].x = i;
c[i].y = i + 1;

fedrock
13-07-2014, 02:12
Il casting obbligatorio con il C++ ma non con il C.

@fedrock ... se il puntatore di tipo

database *c;

se lo restituisci allora la funzione deve essere dello stesso tipo ovvero


database*p(int n)

e anche il puntatore restituito nel main deve essere dello stesso tipo


database*x = p(5);

Inoltre queste linee devono essere semplicemente


c[i].x = i;
c[i].y = i +1;

La mia idea di "restituzione di una struttura" era sbagliata: io credevo che bisognasse restituire l'indirizzo della prima "cella" di memoria dove avevo allocato la struttura con la malloc e quindi poi grazie all'indirizzo poter recupare la struttura ecco perch avevo dichiarato un int, perch alla fine credevo che un indirizzo di memoria non era nient'altro che un numero, evidentemente mi sono perso qualcosa far diverse prove per farmi entrare il concetto.

Grazie, spero di saperne almeno la met di quanto ne sai te un giorno :ciauz:

oregon
13-07-2014, 02:26
Un puntatore alla fine un indirizzo e quindi un numero ma, alla fine, tutto numero in un computer.

Tuttavia bisogna rispettare le regole formali del linguaggio. Se indichi che stai restituendo un certo tipo di puntatore allora tutta la catena deve essere fatta in modo da trattare quel tipo di puntatore (adesso non pensare ad eccezioni o ad usi avanzati).

Loading