2014-11-12 7 views
5

Ho una matrice di strutture, assegnata dinamicamente. Un puntatore a questo array viene passato ad altre funzioni.Accesso all'elemento -1 di una matrice in c

struct body{ 
    char* name; 
    double mass; 
    // ... some more stuff 
    }; 

body *bodies = malloc(Number_of_bodies*sizeof(body)); 

Ho bisogno di conoscere la dimensione della matrice, quindi sto memorizzare la dimensione in uno dei struct, che è nell'elemento 0th della matrice (il primo struct).

bodies[0].mass = (double)Number_of_bodies; 

Ho poi tornare dalla funzione un puntatore al primo elemento dell'array cioè bodies[1]

return (bodies+1); 

Ora, quando uso questo puntatore in altre funzioni, i dati dovrebbero iniziare in corrispondenza dell'elemento 0th .

body *new_bodies = (bodies+1);  //Just trying to show what happens effectively when i pass to another function 
    new_bodies[0] = *(bodies+1);  //I Think 

Se voglio vedere lo struct iniziale, che era a bodies[0], vuol dire che in altre funzioni devo accedere new_bodies[-1]?

È qualcosa che posso fare? Come posso accedere alla struttura iniziale?

+1

Sì. Sicuro. Perchè no? 'a [b]' è definito come '* (a + b)'. – Deduplicator

+1

Strettamente correlato a [Negative array indexes in C?] (Http://stackoverflow.com/q/3473675/1708801) –

risposta

11

Sì, è possibile utilizzare new_bodies[-1] per accedere all'elemento iniziale dell'array. Questo è perfettamente legale.

La ragione di questo è l'aritmetica dei puntatori: parentesi quadre è un altro modo di scrivere +, in modo che quando si scrive new_bodies[-1] è lo stesso come *(new_bodies-1).

Da new_bodies è stato ottenuto come bodies+1, new_bodies-1 è (bodies+1)-1 o bodies, rendendo new_bodies[-1] identico a bodies[0].

Nota: Sembra che si sta cercando di calzascarpe il numero di elementi nella elemento iniziale della matrice delle vostre struct s, ri-proposizione campo mass per esso. Funzionerà, ma non è ottimale, sia in termini di allocazione della memoria (un puntatore name rimane inutilizzato), ma soprattutto in termini di leggibilità. Si sarebbe molto meglio utilizzare un membro di matrice flessibile in un struct che memorizza il numero di voci in modo esplicito:

struct body { 
    char* name; 
    double mass; 
    // ... some more stuff 
}; 
struct bodies { 
    size_t count; 
    body bodies[]; // <<== Flexible array member 
}; 
... 
bodies *bb = malloc(sizeof(bodies)+Number_of_bodies*sizeof(body)); 
bb->count = Number_of_bodies; 

Ecco un link per another Q&A with an example of working with flexible array members.

+0

Questo è esattamente ciò che stavo cercando di fare! Questa è un'ottima soluzione. Grazie mille! – Rohan

Problemi correlati