Каков размер, выделенный указателю на самореферентную структуру

#c #pointers #linked-list

#c #указатели #связанный список

Вопрос:

 struct node 
{ 
    int data1; 
    int data2;
    struct node* link; //line 5
};
  

Сколько памяти будет выделено для строки 5, и будет ли это 1 блок памяти или 2 блока памяти, поскольку то, на что он указывает, имеет два отдельных целых числа.

Пожалуйста, помогите, меня смущает выделение памяти для самореферентных указателей.

Комментарии:

1. Это будет размер указателя на структуру (или точно такой же, как у любого указателя на "обычной" x86-подобной архитектуре). Кстати, вы всегда можете спросить об этом компилятор, используя sizeof operator .

2. Будьте осторожны, когда вы помечаете c , и c ответ может отличаться между 2, потому что это разные языки. В данном случае это то же самое.

3. Вы можете найти это самостоятельно: std::cout << sizeof(struct node*) << "n"

Ответ №1:

Размер указателя на объект всегда одинаков в стандартном C , независимо от того, что содержит указанный объект. Размер может варьироваться в зависимости от системы, но, как правило, указатель имеет 64 бита в 64-разрядных программах, 32 бита в 32-разрядных программах и ... надеюсь, вы получите шаблон.

Аналогией для этого являются адреса зданий. Размер здания не влияет на размер адреса здания.

Ответ №2:

Там есть 2 памяти, одна из которых - память, используемая для хранения указателя в структуре, другая - память, на которую указывает структура.

Размер самого указателя внутри структуры sizeof(struct node*) обычно равен long int или 8 байтам (возможно, это не так, проверьте свою систему).

Для указателя не будет выделено памяти. Скорее всего, он будет указывать на nullptr / 0 . Вы несете ответственность за выделение этой памяти с помощью malloc, new или любого другого механизма выделения.

Комментарии:

1. О, стреляй, пока я это исправлю

Ответ №3:

Тип ссылки на указатель struct node * . Таким образом, логически очевидно, что указатель будет указывать на объект типа struct node . Таким образом, выделенный объем памяти, на который указывает указатель, будет равен sizeof( struct node ) .

Хотя в общем случае вы можете выделить массив объектов типа struct node , на первый элемент которого будет указывать указатель.:) В этом случае объем памяти будет равен N * sizeof( struct node ) , где N - количество элементов в выделенном массиве.

С другой стороны, поскольку указатель является элементом данных структуры, он будет занимать часть объема памяти, выделенной для объекта данного типа struct node . Обычно размер указателя равен 4 или 8 байтам в зависимости от используемой системы.

Вот демонстрационная программа.

 #include <stdio.h>

struct node 
{ 
    int data1; 
    int data2;
    struct node* link; //line 5
};

int main(void) 
{
    printf( "sizeof( struct node ) = %zun", sizeof( struct node ) );
    printf( "sizeof( link ) = %zun", sizeof( struct node * ) );
    
    return 0;
}
  

Вывод программы

 sizeof( struct node ) = 16
sizeof( link ) = 8
  

Или демонстрационная программа может выглядеть следующим образом.

 #include <stdio.h>

struct node 
{ 
    int data1; 
    int data2;
    struct node* link; //line 5
};

int main(void) 
{
    struct node obj;
    
    printf( "sizeof( obj ) = %zun", sizeof( obj ) );
    printf( "sizeof( obj.link ) = %zun", sizeof( obj.link ) );
    
    return 0;
}
  

Выходные данные этой программы аналогичны выходным данным предыдущей программы

 sizeof( obj ) = 16
sizeof( obj.link ) = 8
  

то есть размер объекта типа struct node равен 16 , в то время как его элемент данных link имеет размер, равный 8.