Возвращаемое значение malloc () для типа структуры - PullRequest
0 голосов
/ 02 июня 2019
#include <stdio.h>

struct student
{
  int roll_no;
  int mark;
  struct student *p;
};

int main()
{
  struct student *stu;
  stu = malloc(sizeof(struct student));
}

Какое фактическое возвращаемое значение malloc() для типа конструкции?Как она присваивается структурной переменной?

Теперь для оператора

struct student *stu;

Распределение памяти, например stu с 4 байтами, скажем, начиная с 1000.

А для оператора

stu = malloc(sizeof(struct student));

Сначала выделяется блок памяти, скажем так: 2000 - 2012.Затем в части присваивания указатель на 2000 сохраняется в 1000.

Так работает часть присваивания для malloc() и структурной переменной.

А теперь указатель, т. Е. stuудерживая начальный адрес 2000.Так что теперь stu->roll_no получит доступ к первым 4 байтам, а stu->mark получит доступ к следующим 4 байтам и так далее.Вопрос в том, как компилятор это понимает, это не так, как stu->roll_no эквивалентно *(stu+0) и stu->mark эквивалентно *(stu+1).Пояснения к этому будут высоко оценены.

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

malloc возвращает void * указатель на место в памяти в том размере, в котором вы его отправили, и которое можно привести к любому типу - https://www.tutorialspoint.com/cprogramming/c_type_casting.htm, который вы хотите увидеть в определении malloc: https://www.tutorialspoint.com/c_standard_library/c_function_malloc.htm

0 голосов
/ 02 июня 2019

malloc() возвращает указатель на блок памяти (void *), достаточно большой, чтобы вместить size (первый аргумент) байтов независимо от того, что это за аргумент или какой результат преобразуется.

Например, stu->roll_no будет обращаться к первым четырем байтам (при условии, что int является 32-битным) выделенной памяти (при условии, что структура не заполнена).

В C, void *указатели неявно преобразуются в тип указателя, которому они назначены.

Ваше понимание верно, за исключением следующего утверждения:

И для ясности, в отличие от обычной структурной переменной, котораявыделит 12 байтов для структурного студента, тогда как переменная указателя структуры выделяет всего 4 байта.

В этом случае указатель на структуру размещается в стеке, а сама структура выделяется в куче.Если бы вы использовали структуру напрямую, она бы выделяла 12 байтов в стеке, а в куче - нет байтов.

Вы правы в этом:

это не похоже на stu->roll_no эквивалентно *(stu+0) и stu->mark эквивалентно *(stu+1)

stu->roll_no эквивалентно *((int *)stu+0) и stu->mark эквивалентно *((int *)stu+1).Обратите внимание на приведение к int *.

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