2010-03-10 3 views
1

По какой-то причине, если я пытаюсь получить фактический размер mystruct я получаю размер 1.размера структуры в C равен 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 
} 
+2

Кроме того, используйте% zu вместо спецификатора формата% d для size_t. –

+0

Спасибо, что решили проблему! – Josh

ответ

9

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

Кроме того, почему вы вообще занимаетесь делением? То, что я думаю, что вы хотите:

size_t l = sizeof(struct mystruct); 

или

size_t l = sizeof(**a_struct); 

Edit:

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

+1

«' sizeof' может работать только во время компиляции в C »... Не совсем верно в C99, поскольку в C99' sizeof' может использоваться с VLA, и в этом случае он работает во время выполнения. – AnT

+0

@ AndreyT, хороший звонок. Тем не менее это не относится к подходу с динамическим массивом-от-malloc кода OP. –

4

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

1

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

Оба размера будут такими же.

ли это size_t l = sizeof(struct mystruct);

1

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

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.

Смежные вопросы