Есть стандартное объявление размера указателя? - PullRequest
3 голосов
/ 29 ноября 2010

У меня есть структура с отступом в char (упс, плохо).Я хотел бы вычесть размер указателя.Вы знаете стандартное объявление размера указателя или стандартный макрос для этого?

Ответы [ 4 ]

8 голосов
/ 29 ноября 2010

Вам нужен ответ стандарта C или ответ, который работает почти всегда?

Обычно все указатели на данные имеют одинаковый размер, равный sizeof(void*).

Но так как вы пометили «C» и «стандарты», учтите, что это не требуется стандартом C. Я думаю, что это требуется для POSIX, а также для Win32, и ни в одной из современных современных архитектур нет инструкций, включающих указатели разного размера. Один сценарий, где у вас есть указатели разного размера, - это сегментированные архитектуры памяти с указателями «ближний» и «дальний», хотя, конечно, только один из них может быть «простым» указателем в C на любую данную реализацию. Другой сценарий заключается в том, что в теории указатель на int может быть на 2 бита меньше, чем указатель на char, если int всегда выровнен по 4. Если бы объем памяти был, скажем, 64 МБ, это могло бы означать, что int* умещается в 2 байта, тогда как char* или void* требует 3. Так что стандарт C допускает разные размеры для разных типов, в данном случае sizeof(int*) < sizeof(char*).

Итак, и для ясности, и для гарантии правильности, если p является указателем, то его размер равен sizeof p.

Как сказал Стив Таунсенд в своем комментарии, вполне вероятно, что если вы зададите еще один вопрос о своем коде, вы сможете решить свою реальную проблему. Знание размера указателя не напрямую говорит вам о структуре структуры, содержащей указатель.

8 голосов
/ 29 ноября 2010

sizeof (void *)

2 голосов
/ 29 ноября 2010

Если вы ищете портативный способ найти смещение в байтах элемента структуры, тогда вы хотите использовать макрос offsetof(), определенный в stddef.h:

#include <stdio.h>
#include <stddef.h>

int main(void)
{
    struct s {
        int i;
        char c;
        double d;
        char a[];
    };

    /* Output is compiler dependent */

    printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",
            (long) offsetof(struct s, i),
            (long) offsetof(struct s, c),
            (long) offsetof(struct s, d),
            (long) offsetof(struct s, a));
    printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s));

    return 0;
}

выход

$ ./a.out
offsets: i=0; c=4; d=8 a=16
sizeof(struct s)=16
1 голос
/ 29 ноября 2010

Вы можете использовать sizeof (void *) напрямую.

...