Hello All给出了一个链表节点,
struct node { int data; struct node* next; };
考虑使用4个字节的int . 指针 next 的大小是多少?
我也有以下,
void * ptr; printf("%d",sizeof(ptr));
指针的大小是8个字节 .
我得到sizeof(struct node)为12,给定struct节点中 next 指针大小的大小是多少12.请帮我理解 . 先感谢您 .
在典型系统中,指针的大小与其指向的数据大小无关 . 在32位系统上,指针是32位(4字节),而在64位系统上,指针是64位(8字节) .
您的结构大概是12个字节,大概是因为它包含一个4字节的 int 和一个8字节的指针 . 但是,这是特定于平台的,可能会有所不同 . 许多系统要求值为其大小的整数倍 - 也就是说,64位指针必须从一个8字节倍数的地址开始 . 编译器将在结构成员之间插入填充以满足对齐要求 .
int
在我的x86-64 Linux系统上,结构的大小为16字节: int 为4字节,4字节填充为8字节边界,指针为8字节 .
接下来指针的大小是多少?
大小是 sizeof(struct node*)
sizeof(struct node*)
不应编写代码以依赖于特定结果 .
结果可能是4或8,或1或16或其他 .
编写可移植的C代码依赖于不知道确切的答案,而不是像1到64这样的理智范围 .
OP没有提到需要知道 sizeof(ptr) 大小值的原因,但答案很简单,指针的大小是 sizeof(ptr) . 代码应使用 sizeof(ptr) 而不是像4或8这样的幻数 .
sizeof(ptr)
要打印指针的大小,请使用
some_type* ptr; // printf("%d",sizeof(ptr)); printf("%zu",sizeof(ptr));
z指定以下d,i,o,u,x或X转换规范适用于size_tC11dr§7.21.6.17
像 int * , const int * , void * , int (*)() 这样的指针大小可能不同 . 可移植代码并不假设所有指向各种类型的指针都具有相同的大小 .
int *
const int *
void *
int (*)()
指针的大小是存储地址所需的字节数:
printf("%zu",sizeof(ptr)); printf("%zu",sizeof(struct node *)); printf("%zu",sizeof &abc);
以上每个都应在具有64位地址的机器上返回 8 ,在具有32位地址的机器上返回 4 .
8
4
可以通过解除引用指针来获取节点的大小:
struct node abc; void *ptr = &abc; printf("%zu",sizeof(*((struct node *)ptr)));
如上所述,上面应该在具有64位地址的机器上返回 12 .
12
sizeof(pointer) 是一个常量,无论它在大多数常见的现代系统中指向的普通旧数据类型如何 . 既然你做了:
sizeof(pointer)
并得到 8 bytes 我会冒险猜测你是64位系统 . 这向我表明你的 sizeof(struct node) 将是12个字节,因为你有以下内容:
8 bytes
sizeof(struct node)
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.
4 回答
在典型系统中,指针的大小与其指向的数据大小无关 . 在32位系统上,指针是32位(4字节),而在64位系统上,指针是64位(8字节) .
您的结构大概是12个字节,大概是因为它包含一个4字节的
int
和一个8字节的指针 . 但是,这是特定于平台的,可能会有所不同 . 许多系统要求值为其大小的整数倍 - 也就是说,64位指针必须从一个8字节倍数的地址开始 . 编译器将在结构成员之间插入填充以满足对齐要求 .在我的x86-64 Linux系统上,结构的大小为16字节:
int
为4字节,4字节填充为8字节边界,指针为8字节 .大小是
sizeof(struct node*)
不应编写代码以依赖于特定结果 .
结果可能是4或8,或1或16或其他 .
编写可移植的C代码依赖于不知道确切的答案,而不是像1到64这样的理智范围 .
OP没有提到需要知道
sizeof(ptr)
大小值的原因,但答案很简单,指针的大小是sizeof(ptr)
. 代码应使用sizeof(ptr)
而不是像4或8这样的幻数 .要打印指针的大小,请使用
像
int *
,const int *
,void *
,int (*)()
这样的指针大小可能不同 . 可移植代码并不假设所有指向各种类型的指针都具有相同的大小 .指针的大小是存储地址所需的字节数:
以上每个都应在具有64位地址的机器上返回
8
,在具有32位地址的机器上返回4
.可以通过解除引用指针来获取节点的大小:
如上所述,上面应该在具有64位地址的机器上返回
12
.sizeof(pointer)
是一个常量,无论它在大多数常见的现代系统中指向的普通旧数据类型如何 . 既然你做了:并得到
8 bytes
我会冒险猜测你是64位系统 . 这向我表明你的sizeof(struct node)
将是12个字节,因为你有以下内容: