Пакетирование Malloc Calls - PullRequest
       19

Пакетирование Malloc Calls

0 голосов
/ 05 февраля 2019

Я просматривал SO и нашел некоторый код , который поднял вопрос для меня.

struct node* BuildOneTwoThree() {
struct node *list = malloc(3 * sizeof(struct node));

list[0].data = 1;
list[0].next = list+1;
list[1].data = 2;
list[1].next = list+2;
list[2].data = 3;
list[2].next = NULL;

return list;}

Я пытаюсь понять, как работает этот вызов malloc и что он возвращает.Вернул ли он массив указателей?Как это работает, я не ожидал, что malloc будет работать таким образом?

Похоже, это гарантирует, что индексы памяти отдельных структур следуют один за другим, что, я думаю, может быть мощным или полезным инструментом.

Также после такого вызова malloc будет нормально инициализировать индексы массива как

list[0] = (struct node) {1, list +1};

Примечание: узел структуры определен как,

  struct node{
  int data;
  struct node *next;};

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019
struct node *list = malloc(3 * sizeof(struct node));

==> создал память размером в три узла, и список указывает на начало памяти.Это означает list = & list [0] или * list = list [0], list + 1 = & (list [1]) или * (list + 1) = list [1], list + 2 = & (list [2]) или * (list + 2) = list [2]

list[0] = (struct node) {1, list +1};

==> Да, вы можете сделать это.Вот моя модификация таким образом, она работала нормально:

struct node* BuildOneTwoThree() {
    struct node *list = (struct node *)malloc(3 * sizeof(struct node));

    list[0] = { 1, list + 1 };
    list[1] = { 2, list + 2 };
    list[2] = { 3, NULL };
    return list;
}
0 голосов
/ 05 февраля 2019

malloc возвращает указатель на область памяти с указанным размером.

Аргумент 3 * sizeof(struct node) говорит, что размер области может хранить 3 node структур.

Указателии индексы в массивах являются взаимозаменяемыми, как обсуждалось в этом ответе .

...