2015-04-22 22 views
5

Supponiamo che io ho una struct C definito come segue:Struttura memoria di C struct con array

typedef struct 
{ 
    double array1[2]; 
} struct0_T; 

Come è la memoria disposto? La struttura conserverà solo un puntatore o il valore dei due doppi? Prima ho pensato che la struttura avesse un puntatore, ma oggi ho scoperto (con mia sorpresa) che i valori sono memorizzati lì. Varia tra diversi compilatori?

+3

Conserverà i valori. E no, non differisce tra i compilatori. –

+1

Se contenesse solo un puntatore, dove sarebbero i dati? Gli array –

+1

non sono puntatori. In alcune situazioni gli array decadono per puntare. Questa non è sicuramente una di quelle situazioni. – bolov

risposta

9

La struttura contiene i due valori. Il layout di memoria è .array1[0], seguito da .array1[1], opzionalmente seguito da una certa quantità di riempimento.

Il padding è l'unica parte di ciò che può variare tra i compilatori (anche se in pratica, con l'unico membro della struttura che è un array, non ci sarà quasi certamente nessuna spaziatura).

Anche se si può aver sentito che un array in C è un puntatore, non è vero: un array è un tipo aggregato costituito da tutti gli oggetti membro, proprio come una struttura. È solo che in quasi tutti i contesti di espressioni, un array valuta un puntatore al suo primo membro.

+1

Le matrici non possono avere byte di riempimento, le strutture possono. – edmz

2

La dichiarazione di struttura sopra riportata informa il compilatore che le variabili di quel tipo di struttura dati struct occuperanno sizeof(struct0_T) byte di memoria e questa memoria verrà allocata quando verrà creata un'istanza di una variabile di quel tipo.

struct0_T s; 

Ora, s contiene una matrice di due doubles. In questo caso non ci saranno imbottiture.