Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C] Array adimensionali di struct?

    Salve a tutti, ho un dilemma da porvi.
    Mi è venuto un dubbio sulle struct e quindi ho realizzato un programma molto semplice per esporvi il mio "problema". Il codice è il seguente:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct Classifica {
    
    	int id;
    	int totale;
    
    } Classif ;
    
    	Classif clas[];
    
    int main()
    {
        int i;
    
        for(i=0; i<100; i++)
        {
            clas[i].id = i+i;
            clas[i].totale = i;
        }
    
        for(i=0; i<100; i++)
        {
            printf("%d | %d-%d\n", i, clas[i].id, clas[i].totale);
        }
    
        return 0;
    }
    Notare il Classif clas[];: il programma in questo caso crea effettivamente 100 struct.
    Ho provato a compilare con GCC e non risulta alcun errore o warning.

    Il dilemma è il seguente:
    E' giusto o sbagliato utilizzare le struct in questo modo alquanto dinamico?
    E' una funzione realmente voluta del C oppure è un caso particolare applicabile solo con qualche vincolo (di cui io non sia a conoscenza)?
    Ovvero, è "pericoloso" oppure è una pratica usata quando non si vuole passare per le liste?

    Grazie per la risposta che vorrete darmi!

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ciao...non sono molto esperto di C....ma per quello che ho studiato...non penso si possa fare una cosa del genere...anche perchè penso che se provi a compilare appunto ti dovrebbe dare un errore o un warning qua
    Classif clas[];
    ...e poi se funzionava così semplicemente non penso che si ricorreva alle liste o a allocazione dinamica he invece sn un pò più difficili da gestire...comunque aspetta se interviene qualcuno di più esperto...magari sa qualcosa di più e ti saprà spiegare meglio...
    ciao

  3. #3
    Un warning a dire il vero c'è: "array 'clas' assumed to have one element", ma poi per il resto il programma fila liscio come l'olio. Qundi sarà sbagliato o no? :S

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    In assenza di inizializzatori in un array senza dimensioni, avrai solo un elemento 0.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    In assenza di inizializzatori in un array senza dimensioni, avrai solo un elemento 0.
    ma comunque per quale motivo funziona.?? secondo quello che dice il warning si intuirebbe che ci sarebbe un solo elemento del vettore...però poi nel ciclo non va in crash nonostante esca dalle dimenzioni del vettore...dico bene?

  6. #6
    Grazie per le risposte.
    Se dichiarato localmente non funziona, funziona solo se dichiarato globalmente.
    Ho fatto delle prove e questo avviene anche con altri vettori, ad esempio di caratteri.

    Per ciò che so questo non dovrebbe poter funzionare ed invece funziona! La scoperta è stata casuale in quanto, avendo impostato una dimensione massima dell'array, il compilatore era in grado di allocare ulteriormente altre struct fin e richiamarle come se la dimensione massima assegnata precedentemente non avesse alcuna importanza. Ho quindi provato ad eliminare la dimensione massima e ha continuato a funzionare.

    Vorrei sapere se qualcuno sa spiegarmi perchè questo avvenga e se sia qualcosa di voluto oppure qualcosa di instabile e da evitare. Grazie ancora.

  7. #7
    Originariamente inviato da Ruggi
    Vorrei sapere se qualcuno sa spiegarmi perchè questo avvenga e se sia qualcosa di voluto oppure qualcosa di instabile e da evitare. Grazie ancora.
    Dal momento che hai un array di un solo elemento e ne usi 100 è chiaramente qualcosa di sbagliato e da evitare; il fatto che funzioni è solo un caso, probabilmente in memoria dopo l'array di un elemento c'è dello spazio inutilizzato che tu qui vai ad utilizzare abusivamente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    Originariamente inviato da MItaly
    Dal momento che hai un array di un solo elemento e ne usi 100 è chiaramente qualcosa di sbagliato e da evitare; il fatto che funzioni è solo un caso, probabilmente in memoria dopo l'array di un elemento c'è dello spazio inutilizzato che tu qui vai ad utilizzare abusivamente.
    Esattamente..

    Quando allochi della memoria per gli array, il compilatore riserva memoria contigua,
    se tu allochi int array[10], e poi fai array[10] = 0; a meno di problemi te lo fa fare
    anche se sei in uno spazio che in realtà non hai riservato..


    E' piuttosto pericoloso, insicuro, senza contare che in quell'area di memoria,
    potrebbe esserci memorizzata un'altra tua variabile, con conseguenze
    immaginabili..

    Fortunatamente non credo che riesci a modificare lo spazio di sistema,
    ti dovrebbe dare errore prima.
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  9. #9
    Originariamente inviato da LexLex
    Fortunatamente non credo che riesci a modificare lo spazio di sistema,
    ti dovrebbe dare errore prima.
    Su tutti i sistemi operativi moderni è impossibile modificare la memoria usata dal sistema o dalle altre applicazioni, dal momento che ad ogni processo viene dedicato uno spazio di indirizzi virtuale privato.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    Originariamente inviato da MItaly
    Su tutti i sistemi operativi moderni è impossibile modificare la memoria usata dal sistema o dalle altre applicazioni, dal momento che ad ogni processo viene dedicato uno spazio di indirizzi virtuale privato.
    Grazie..
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

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.