首页 文章

链表中Next指针的大小?

提问于
浏览
0

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.请帮我理解 . 先感谢您 .

4 回答

  • 0

    在典型系统中,指针的大小与其指向的数据大小无关 . 在32位系统上,指针是32位(4字节),而在64位系统上,指针是64位(8字节) .

    您的结构大概是12个字节,大概是因为它包含一个4字节的 int 和一个8字节的指针 . 但是,这是特定于平台的,可能会有所不同 . 许多系统要求值为其大小的整数倍 - 也就是说,64位指针必须从一个8字节倍数的地址开始 . 编译器将在结构成员之间插入填充以满足对齐要求 .

    在我的x86-64 Linux系统上,结构的大小为16字节: int 为4字节,4字节填充为8字节边界,指针为8字节 .

  • 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));
    

    z指定以下d,i,o,u,x或X转换规范适用于size_tC11dr§7.21.6.17

    int *const int *void *int (*)() 这样的指针大小可能不同 . 可移植代码并不假设所有指向各种类型的指针都具有相同的大小 .

  • 1

    指针的大小是存储地址所需的字节数:

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

    以上每个都应在具有64位地址的机器上返回 8 ,在具有32位地址的机器上返回 4 .

    可以通过解除引用指针来获取节点的大小:

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

    如上所述,上面应该在具有64位地址的机器上返回 12 .

  • 1

    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.
    

相关问题