2017-01-18 7 views
0

Привет всем дано узел связанного списка, как,Размер следующего указателя в связанном списке?

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

Рассмотрим Int с 4 bytes.What будет размер указателя следующий?

А также у меня есть следующие,

void * ptr; 
printf("%d",sizeof(ptr)); 

Размер указателя составляет 8 байт.

Я получаю sizeof (struct node) как 12, как размер следующий Размер указателя в данном узле структуры - 12. Пожалуйста, помогите мне разобраться. Спасибо заранее.

+0

'sizeof (ptr)' всегда является размером указателя, независимо от того, на что он указывает. – AlexD

+0

@AlexD Итак, если указатель имеет тип int, где int - 4 байта, тогда размер указателя int равен размеру указателя. Спасибо. – Anil

+2

@AlexD 'sizeof (char *)' не обязательно должен быть равен 'sizeof (double *)', 'sizeof (int (*)())' и т. Д. Все точки объектов могут преобразовываться в 'void *', но это не так они должны быть одинакового размера. Тем не менее, одинаковые указатели объектов размера очень распространены. – chux

ответ

1

О типичных системах размер указателя не зависит от размера данных, которые он указывает. В 32-битной системе указатели 32 бита (4 байта), а в 64-разрядной системе указатели - 64 бита (8 байтов).

Ваша структура составляет 12 байтов, предположительно потому, что она содержит 4 байта int и 8-байтовый указатель. Однако это зависит от платформы и может варьироваться. Многие системы требуют, чтобы значения были aligned в целом кратным их размеру, то есть 64-разрядный указатель должен начинаться с адреса, кратного 8 байтам. Компиляторы будут вставлять отступы между элементами структуры для соответствия требованиям к выравниванию.

На моей системе x86-64 Linux размер вашей структуры составляет 16 байт: 4 байта для int, 4 байта заполнения для достижения 8-байтовой границы и 8 байтов для указателя.

+0

Не согласен «размер указателя не зависит от размера данных, на которые он указывает». Размер указателей на функции часто отличается от указателей на объекты. – chux

+0

'char * p; double * q; printf ("% d% d", sizeof (p), sizeof (q)); 'оба будут печатать одинаковое значение; – Anil

+0

@subsea Это может быть на вашей платформе, но не указано, что в C. – chux

1

Размер указателя является количество байтов, необходимых для хранения адреса:

printf("%zu",sizeof(ptr)); 
printf("%zu",sizeof(struct node *)); 
printf("%zu",sizeof &abc); 

Каждый из вышеперечисленных должен вернуться 8 на машине с 64-разрядными адресами и 4 на машине с 32-битным адреса.

Размер узла может быть получен путем разыменования указателя:

struct node abc; 
void *ptr = &abc; 
printf("%zu",sizeof(*((struct node *)ptr))); 

выше должна возвращать 12 на машине с 64-битовыми адресами, как упоминалось выше.

+0

Оператор 'sizeof' возвращает тип' size_t', который не совпадает с 'int'. С 'printf ("% d ", sizeof (ptr));', теперь мы рассматриваем 3 типа 'int',' size_t' и 'void *'. – chux

+0

@chux, это правильно, и это не очень хорошая практика. Но он должен скомпилироваться и работать правильно (как без неопределенных последствий), правильно? – user1952500

+0

Нет. Лучше использовать 'printf ("% zu ", sizeof (* ptr));', это то, что для модификатора 'z',' size_t' – chux

0

sizeof(pointer) является константой, независимо от простого старого типа данных, на который указывает наиболее распространенные современные системы. Так как вы сделали:

sizeof(ptr) 

и получил 8 bytes я рискну предположить, что вы находитесь на 64-битной системе. Это указывает мне, что ваш sizeof(struct node) будет 12 байт, потому что у вас есть следующее:

struct node { 
    int data; // 4 Bytes (32 bit, a common size for `int`s) 
    struct node* next; // 8 Bytes, as are all pointers on your system 
}; // total size of 12 bytes. 
+0

Улучшение, но «sizeof (указатель) является константой, независимо от простого старого типа данных, на который указывает.» не поддерживается C spec, хотя это и является общим. Указатели на другой объект типы могут отличаться по размеру - хотя это становится все реже. – chux

+1

Это зависит от архитектуры/режима работы, например, в реальном режиме x86 имеются «ближние» и «дальние» указатели разных размеров. –

1

Каким будет размер указателя дальше?

Размер является sizeof(struct node*)


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

Результат может быть 4 или 8, или 1 или 16 или другие.

Запись переносимый код C полагается на не точно знать ответ другой, чем в какой-то вменяемый диапазоне, как 1 к 64.

OP не упомянул причину необходимости знать значение размера sizeof(ptr) , но ответ - это просто размер указателя sizeof(ptr). Код должен использовать sizeof(ptr), а не магическое число, как 4 или 8.


до печати размер указателя, используйте

some_type* ptr; 
// printf("%d",sizeof(ptr)); 
printf("%zu",sizeof(ptr)); 

г также указывает, что следующий д, i, o, u, x или X применимы к size_t C11dr §7.21.6.1 7

Размер указателя, такого как int *, const int *, void *, int (*)() может отличаться. Портативный код не предполагает, что все указатели на разные типы имеют одинаковый размер.