首页 > 解决方案 > 链表地址不定期

问题描述

我试图弄清楚 newNode 地址如何改变 appendNode 的每次迭代。当我将地址从十六进制转换为十进制时,我得到的值是 14683824、14683848、14685096。虽然前两个地址似乎增加了 24,但第三个地址增加了 1248。我不知道为什么会发生这种情况。

//Main Program
#include <iostream>
#include "numberList.h"

using namespace std;

int main()
{
    numberList list;

    list.appendNode(2.5);
    list.appendNode(3.4);
    list.appendNode(5.6);


   // list.displayList();


    return 0;
}

//append.cpp
#include <iostream>
#include "numberList.h"

using namespace std;

void numberList ::appendNode(double num)
{
   listNode *newNode;
   listNode *nodePtr;

   newNode = new listNode;
   newNode->value = num;
   newNode->next = nullptr;

   cout << newNode << endl; //The addresses of the newNode dont have even 
 intervals

   if(!head)
      {
       head = newNode;
      }
   else
   {
       nodePtr = head;

       while(nodePtr->next)
       {
           nodePtr = nodePtr->next;

       }
   }

}

//numberList.h
#ifndef APPENDNODE_NUMBERLIST_H
#define APPENDNODE_NUMBERLIST_H

class numberList
{
private:
    struct listNode
    {
        double value;
        struct listNode *next;
    };

    listNode *head;

public:
    numberList()
    {
        head = nullptr;
    }
   //~numberList();
    void appendNode(double);
    void displayList() const;
    void insertNode(double);
    void deleteNode(double);

};
#endif //APPENDNODE_NUMBERLIST_H

输出:

0xe00eb0 0xe00ec8 0xe013a8

标签: c++

解决方案


该标准没有为您提供任何关于您分配的内存位置的保证。new可以为您提供彼此相邻的位置,但也可以完全随机地为您提供位置。你最终得到什么取决于

  • 用于分配的算法new
  • 先前分配的模式

那么这次为什么会发生呢?一般而言,连续分配最终接近在一起是有意义的,因为这减少了缓存未命中的机会,但new没有义务这样做。事实上,因为new偶尔需要向操作系统请求内存,并且因为new必须使用一些内存来跟踪分配的内容,所以无法保证所有分配都定期发生。


推荐阅读