выделение памяти для структурных указателей - PullRequest
0 голосов
/ 06 мая 2019

Почему при объявлении структурного указателя нам нужно выделить память

struct A{
///
};
int main(void)
{
    struct A *var=(struct A*)malloc(sizeof(struct A));
//
//
}

, но когда мы объявляем структурную переменную, нам не нужно выделять какую-либо память?

struct A var;

Ответы [ 2 ]

3 голосов
/ 06 мая 2019

Это верно для любых указателей, а не только указателей на структуры.Причина в том, что когда вы объявляете переменную (типа int, char или типа некоторой структуры A), вы указываете компилятору создать новую переменную / экземпляр.Таким образом, компилятор автоматически выделяет память для этой переменной.Но когда вы объявляете указатель на некоторую int или некоторую структуру A, вы, по сути, говорите компилятору, что вам нужна ссылка на некоторую переменную, а не на новую переменную этого типа полностью.Чтобы проиллюстрировать это:

struct A{};
int a,b; // New variable a and b
struct A c,d; // New variables c,d of type struct A

// Now take a look at this:

int *px;
px = &a; // px referencing to a, no new int variable created;
px = &b; // px referencing to b, no new int variable created;

struct A* py;
py = &c; // py referencing to c, no new struct A variable created;
py = &d; // py referencing to d, no new struct A variable created;

Теперь, если вы просто объявите указатель A * p, здесь p ни на что не ссылается.Итак, если вы хотите, чтобы p ссылался на новый экземпляр структуры A, вы должны написать явно:

c
p = (struct A*)malloc(sizeof(struct A));
0 голосов
/ 06 мая 2019
  • struct A var объявляет переменную var в области стека основной памяти с внутренней структурой, как объявлено в struct A.

  • struct A * var также объявляет переменную var в области стека основной памяти, но var теперь является указателем, и, как вы знаете, указатель в C используется для хранения адреса переменной , поэтому var нужно знать, что это за адрес, а запись (struct A*)malloc(sizeof(struct A)); дает вам адрес.

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