【问题标题】:C++ Memory address in linked list and in array链表和数组中的 C++ 内存地址
【发布时间】:2017-09-26 13:38:13
【问题描述】:

我有简单的程序

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

int main()
{
    // Make linked list with 10 Node
    Node* head = new Node();
    head->data = 9;
    Node* link = head;
    for (int i = 0 ; i < 9 ; ++i)
    {
        Node* newNode = new Node();
        newNode->data = i;
        link->next = newNode;
        link = newNode;
    }
    printListAddress(head);
    // Make array of 10 Node
    Node* arr= new Node[10];
    printArrAddress(arr, 10);
    return 0;
}

我得到了

0x1f97c20   0x1f97c40   0x1f97c60   0x1f97c80   0x1f97ca0   
0x1f980d0   0x1f980e0   0x1f980f0   0x1f98100   0x1f98110

在链表中,每个节点的内存地址差为20,在数组中为10,但sizeof(arr[i]) = sizeof(*head) =16。请解释我的区别。 感谢大家的帮助;

【问题讨论】:

  • "in array is 10" - 你知道“10”是十六进制的,我希望。
  • 没有理由以任何有意义的模式分配您的列表节点。但是,您的节点数组保证是连续的并且步幅为sizeof(Node)
  • 但也不能保证sizeof(Node) 是什么,编译器可以将其填充到它认为合适的大小。

标签: c++ arrays memory linked-list


【解决方案1】:

new 可以随意分配您请求的内存,因此您不应假设返回的地址存在模式。

对于数组,数组中的项目将在内存中彼此相邻(数组是连续的字节块)。对于T 类型,项目将sizeof(T) * index 字节放入数组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2020-08-15
    • 2013-12-09
    • 1970-01-01
    • 2019-04-07
    • 2013-12-31
    相关资源
    最近更新 更多