2015-02-09 2 views
2

Я понимаю разницу между распределением памяти с помощью malloc для массива struct и массива указателей на struct. Но я хочу назначить память с помощью malloc для массива struct, в том случае, если сама структура содержит указатель на другую структуру. Вот код для того, что я пытаюсь сделать:Распределение памяти для структуры с использованием malloc, где одна из записей данных указатель

#include<stdio.h> 
#include<stdlib.h> 

typedef struct linkedlist { 
    int pCol; 
    struct linkedlist *next; 
} plist; 

typedef struct particle { 
    int color; 
    double rad; 
    double rx; 
    double ry; 
    double vx; 
    double vy; 
    struct linkedlist *event; 
} state; 

int main() 
{ 
    int N = 5, w = 4; 

    plist *ls = (plist*)malloc((N+w)*sizeof(plist)); 
    printf("N=%d, w=%d, sizeof state=%d, total=%d, sizeof discs=%d\n\n", 
    N,w,sizeof(plist), (N+w)*sizeof(plist), sizeof(ls)); 

    state *discs = (state*)malloc((N+w)*sizeof(state)); 
    printf("N=%d, w=%d, sizeof state=%d, total=%d, sizeof discs=%d\n", 
    N,w,sizeof(state), (N+w)*sizeof(state), sizeof(discs)); 
    return 0; 
} 

Когда я запускаю это, я получаю следующий результат:

N=5, w=4, sizeof plist=8, total=72, sizof ls=4 

N=5, w=4, sizeof state=56, total=504, sizof discs=4 

Итак, я хочу знать, почему низкоспиновое или диски получить назначено только 4 байта и как я могу получить всего памяти, необходимой для этих массивов структур?

+0

Общая память, необходимая для указателя *, составляет * 4 байта (или 8 или 2, в зависимости от платформы). Подумайте об этом на минуту ... это * указывает * на что-то, а не на * что-то. ;-) – DevSolar

+0

'ls' и' discs' имеют тип указателя, размер которого 4 байта в 32-битных системах. – Rohan

ответ

2

Вы печатаете размер указателя (ls), а не размер типа данных/structrure, указанный указателем (* ls).

ли sizeof(*ls) и sizeof(*discs) в ваших PRINTF заявления, если вы собираетесь найти размер plist и state, потому что где ls и discs пункт.

Если вы хотите напечатать общий размер, выделенный для ls или discs от malloc. Это невозможно. Не собирается печатать ((N+w)*sizeof(plist)). Так что даже делать sizeof(*ls) не собирается сказать вам, сколько plist структуры вы выделили

+0

Я сделал sizeof (* ls) и sizeof (* диски) в моих кодах printf, но теперь выход будет: N = 5, w = 4, sizeof state = 8, total = 72, sizeof ls = 8, что означает размер по-прежнему of ls не 72. Почему? – Neha

+0

Вы не можете найти размер памяти, выделяемый указателю. Вы должны сами отслеживать это. Если вы делаете 'sizeof (ptr)', он даст вам размер ptr для этой архитектуры. если вы делаете 'sizeof (* ptr)', он даст вам размер типа данных/структуры, который также указывает ptr. –

1

в вашем коде, ls имеет тип plist *, .i.e., Указатель.

sizeof() является оператором, который возвращает размер типа данных, а не объем выделенной памяти.

То же самое касается discs.

+0

Спасибо за объяснение. Но тогда у меня есть еще один вопрос. Для sizeof (ls) правильные байты ans 4 байта, но тогда как мне узнать общую память, выделенную для массива struct? – Neha

+2

@Neha Вы не можете, по крайней мере, не использовать 'sizeof()'. –

+0

Ну, а причина внизу? Если кто-нибудь объяснит, я буду благодарен. –