Почему разные значения sizeof (datatype_pointer) / sizeof (datatype) для разных типов данных? - PullRequest
0 голосов
/ 08 марта 2012

Я объявил следующую структуру в моей программе на C ++:

    struct person {
        char name[10];      /* first name */
        char id[10];        /* ID number */
        off_t pos;      /* position in file, for demonstration */
    } people[] = {
        { "arnold", "123456789", 0 },
        { "miriam", "987654321", 10240 },
        { "joe",    "192837465", 81920 },
    };

        j = sizeof(people) / sizeof(people[0]);     /* count of elements */

дает j = 3 здесь, т.е. нет элементов в массиве; всегда, даже если вы добавляете или уменьшаете элементы ...

Но

         char b[8];
         i = sizeof(b)/sizeof(b[0]);

дает значение i = постоянная = 4 на моей машине.

Теперь это оправдано, так как sizeof (char *) постоянен на моей машине, а sizeof (char) тоже постоянен.

Но как только я объявляю struct person, sizeof (person *) и sizeof (person) также должны быть постоянными, и это также должно давать постоянное значение, не так ли?

Ответы [ 3 ]

5 голосов
/ 08 марта 2012

Ваш компилятор неверен.

char b[8];
i = sizeof(b)/sizeof(b[0]);

должно дать i==8.

Результат, который вы получаете за размер struct, правильный. Я бы переключил компиляторы на вашем месте.

Если бы вы передали b в функцию, вычисляющую размер, вы были бы правы. Но, как код сейчас, нет.

Кроме того, если бы это была функция, вычисляющая sizeof(people) / sizeof(people[0]), которая получила people в качестве параметра, вы бы также получили константу.

Это потому, что массивы распадаются на указатели при передаче в качестве аргументов.

4 голосов
/ 08 марта 2012

Вы уверены, что на самом деле применяете sizeof к массиву, а не к указателю?

В таком случае аргумент функции на самом деле является указателем, поэтому вы получите i == sizeof(char*):

void f(char b[8]) {
    i = sizeof(b)/sizeof(b[0]);
}

Код, который вы разместили, должен точно указывать количество элементов массива. Если этого не произойдет, то либо в вашем коде есть что-то очень странное, либо ваш компилятор безнадежно сломан.

1 голос
/ 08 марта 2012
  char b[8];          
  i = sizeof(b)/sizeof(b[0]); 

Это должно дать значение только 8.sizeof (b) даст размер массива, а не sizeof (char *), как вы воспринимаете.

...