Search code examples
cmemorystructsizeofmemory-alignment

struct components don't add up


I have the following:

typedef struct
{
    string city;
    int temp;
}
avg_temp;

avg_temp temps[NUM_CITIES];

void sort_cities(void);

int main(void)
{
    temps[0].city = "Austin";
    temps[0].temp = 97;

    temps[1].city = "Boston";
    temps[1].temp = 82;

    temps[2].city = "Chicago";
    temps[2].temp = 85;

    temps[3].city = "Denver";
    temps[3].temp = 90;

    temps[4].city = "Las Vegas";
    temps[4].temp = 105;

    temps[5].city = "Los Angeles";
    temps[5].temp = 82;

    temps[6].city = "Miami";
    temps[6].temp = 97;

    temps[7].city = "New York";
    temps[7].temp = 85;

    temps[8].city = "Phoenix";
    temps[8].temp = 107;

    temps[9].city = "San Francisco";
    temps[9].temp = 66;
}

Now, the sizeof(temps) = 160, sizeof(temps[0]) = 16, sizeof(temps[0].city) = 8 and sizeof(temps[0].temp = 4.

since city and temp take up 12 what takes up 4 in temps[0] ?


Solution

  • This structure

    typedef struct
    {
        string city;
        int temp;
    }
    avg_temp;
    

    is aligned according to the more strict alignment of its data member of the type string (which is evidently an alias for the type char *) that has the size equal to 8.

    So the structure is appended with 4 bytes.