размер структуры в c равен 1 - PullRequest
1 голос
/ 10 марта 2010

По какой-то причине, если я пытаюсь получить фактический размер mystruct, я продолжаю получать размер 1.

Я знаю, что mystruct содержит данные, потому что я могу выгрузить их, и все в mystruct.

В чем может быть причина получения размера 1? Спасибо

// fragments of my code
struct mystruct {
    char *raw;
    int  count;
};

struct counter {
    int total; // = 30
}

static struct mystruct **proc()
{
    int i = 0;
    gchar *key,*val;
    struct mystruct **a_struct;
    struct counter c;

    a_struct = (struct mystruct **)malloc(sizeof(struct mystruct *)*c.total);
    while (table (&iter, (gpointer) &key, (gpointer) &val)) {

        a_struct[i] = (struct mystruct *)malloc(sizeof(struct mystruct));
        a_struct[i]->raw = (char*)key;
        a_struct[i++]->count = (int)val;

    }

    size_t l = sizeof(a_struct) / sizeof(struct mystruct*);
    printf("%d",l); // outputs 1
}

Ответы [ 4 ]

8 голосов
/ 10 марта 2010

Вы делаете пару вещей неправильно. Сначала вы берете sizeof(a_struct), который будет размером с указатель (поскольку это то, чем является a_struct), а затем делитесь на размер другого указателя. Гарантировано 1.

Кроме того, зачем вы вообще делите? Я думаю, что вы хотите:

size_t l = sizeof(struct mystruct);

или

size_t l = sizeof(**a_struct);

Edit:

Мне кажется, я вижу причину вашего разделения сейчас; Вы пытаетесь найти размер этого массива. Это не сработает - sizeof может работать только во время компиляции в C (с некоторыми специальными исключениями в C99, которые не применимы к вашему коду), поэтому он не может определить размер динамического массива подобным образом

4 голосов
/ 10 марта 2010

вы делите размер указателя на размер указателя.

1 голос
/ 10 марта 2010

Вы берете размер двух указателей и делите один на другой,

size_t l = sizeof(a_struct) / sizeof(struct mystruct*);

a_struct объявлен как struct mystruct **a_struct, так что это то же самое, что сказать

size_t l = sizeof(struct mystruct **) / sizeof(struct mystruct*);

, поскольку все указатели имеют одинаковый размер, ** такой же размер, как и *, поэтому всегда будет иметь значение 1.

Я не совсем уверен, что вы пытаетесь распечатать здесь, размер a_struct? или общий размер выделения? Размер a_struct равен просто c.total, общее выделение - это сумма всех значений, которые вы передали malloc.

1 голос
/ 10 марта 2010

a_struct - двойной указатель на struct mystruct.
struct mystruct * является указателем на struct mystruct.

Оба размера там будут одинаковыми.

Сделай это size_t l = sizeof(struct mystruct);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...