链接列表地址不是固定间隔

时间:2019-05-12 20:27:49

标签: c++

我试图弄清楚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

1 个答案:

答案 0 :(得分:2)

该标准不能为您分配的内存位置提供任何保证。 new可以为您提供彼此相邻的位置,但也可以在完全随机的基础上为您提供位置。您最终要得到什么具体取决于

  • new用于分配的算法
  • 以前的分配方式

那为什么为什么会发生这种情况?总的来说,连续分配最终会紧密靠近是有意义的,因为这减少了缓存未命中的机会,但是new没有这样做的义务。实际上,由于new有时需要从操作系统请求内存,并且因为new必须使用一点内存来跟踪分配的内容,因此无法保证所有分配均定期进行。