2013-12-07 4 views
0

Обычно я создаю себе структуру и выделяю память для структуры, а иногда и для буферов внутри структуры. Вроде так:Разница между указателями при malloc

typedef struct A 
{ 
    char *buffer; 
    int size; 
} A; 

Тогда, когда я malloc для структуры, я это делаю. (Я узнал, не метать возвращение таНос здесь на SO.)

X

A *a = malloc(sizeof(a)); 
a->buffer = malloc(10*sizeof(a->buffer)); 

Какая разница между X и Y этого?

Y

A *a = malloc(sizeof(*a)); 
a->buffer = malloc(10*sizeof(a->buffer)); 

Они, кажется, делают то же самое.

+0

Я предполагающих ваши 'buffer' указатель указывает на произвольное количество данных? Это не ясно из вашего фрагмента кода. В этом случае 'a-> buffer = malloc (sizeof (a-> buffer)" неверен, поскольку он всегда будет выделять только 4 байта или 8 байтов в зависимости от того, находитесь ли вы на 32-битной или 64-битной машине. – lurker

+1

разница в том, что 'sizeof (a *)' является синтаксической ошибкой, тогда как 'sizeof (a)' более тонко неверно. –

+0

Почему вы хотите выделить в 10 раз размер буфера для нашего буфера? – lurker

ответ

6

Неправильно, второй даже не компилируется.

Вы хотите либо из них:

A * a = malloc(sizeof(A)); // repeat the type 

// or: 

A * a = malloc(sizeof *a); // be smart 

Тогда:

a->size = 213; 
a->buffer = malloc(a->size); 
+0

'a-> buffer = malloc (a-> size);' Будет ли компилятор знать размер символа 'size *? –

+1

@MikeJohn:' sizeof (char) 'является одним, по определению. Как правило, вам придется умножать на размер типа, действительно. –

+0

Хотя я добавил '10' * sizeof ... в редактировании, почему вы говорите, что второй не компилируется? –

0

вы должны типаж его (A *), потому что calloc или таНос возврата пустоте *.

A *a=(a*)malloc(sizeof(A)); 

предположим, что вы хотите выделить память для буфера 10 символов

a->buffer=(char *)malloc(sizeof(char)*10); 
+0

действительно? типаж? как насчет [этого] (http://stackoverflow.com/q/605845/2173917)? –

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