#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.