выделение памяти для указателей на структуру внутри структуры - PullRequest
1 голос
/ 01 ноября 2011

У меня есть 2 структуры:

struct b{int b;float d;}; and 
struct a{int count; struct b* ptr;}
struct a *a_temp;

Теперь я выделяю память для 10 структур типа b и помещаю адрес в ptr структуры a.(мне дали код, и по какой-то причине они не хотели использовать двойной указатель)

a_temp = (struct a*)malloc(sizeof(struct a));
a_temp->ptr = (struct b*)malloc(10*sizeof(struct b));
struct b* b_temp;

Мне нужно загрузить адрес второй структуры типа b в temp_b.Я попытался b_temp = a_temp->ptr[1];, что дает ошибку, но b_temp = &(a_temp->ptr[1]); работает, когда я пытаюсь использовать это и получить доступ к содержимому структуры b, используя это, почему это так?

заранее спасибо

1 Ответ

3 голосов
/ 01 ноября 2011

ptr[1] - это структура, на которую указывает ptr + 1 (точно так же, как *(ptr+1)), b_temp получает указатель на структуру, поэтому вам нужно передать адрес a_temp->ptr[1], то есть &a_temp->ptr[1].

expression      | type
---------------------------
a_temp->ptr     | struct b*
a_temp->ptr[1]  | struct b
&a_temp->ptr[1] | struct b*
a_temp->ptr + 1 | struct b*
b_temp          | struct b*

Edit:

если у вас есть указатель, скажем, int * x, то следующие выражения идентичны: x[1] и *(x+1), и они оба используют адрес x+1. другими словами, значение этих выражений является типом переменной, на которую указывает указатель x, в данном случае это int, поскольку x равно int * (указатель на int), он содержит адрес для переменной int.

...