Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di fedrock
    Registrato dal
    Jun 2009
    residenza
    Milan
    Messaggi
    342

    [C] Malloc/Calloc/Realloc e strutture/funzioni...

    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:
    codice:
    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 emoji17.png

    codice:
    #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...

    I SHOULD TELL YOU SOMETHING NEW:
    don't want you here.


  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Ma se c è giustamente un puntatore a struttura database, come mai la tua funzione restituisce un int ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di fedrock
    Registrato dal
    Jun 2009
    residenza
    Milan
    Messaggi
    342
    Quote Originariamente inviata da oregon Visualizza il messaggio
    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
    codice:
    #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;
    }

    I SHOULD TELL YOU SOMETHING NEW:
    don't want you here.


  4. #4
    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
    shiviphpdevelopment

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    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;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it L'avatar di fedrock
    Registrato dal
    Jun 2009
    residenza
    Milan
    Messaggi
    342
    Quote Originariamente inviata da oregon Visualizza il messaggio
    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

    I SHOULD TELL YOU SOMETHING NEW:
    don't want you here.


  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    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).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.