首页 > 解决方案 > 链表c ++:附加功能似乎不起作用

问题描述

我试图理解 C++ 中的指针和链表。为此,我编写了一个小程序。我似乎在使用 curPtr 浏览列表时遇到了麻烦,这似乎给了我列表中的所有初始元素,但不是我附加的那个。我不知道有什么问题。这是我的主要功能:

int sizeOfLL = 5;
int* LLtail;
int* LLcur;
int* LLhead;
std::cout << "start values: " << (long long) LLhead << " " << (long long) LLcur  << " " <<  (long long) LLtail  << std::endl;
makeLListCstyle(LLhead, LLtail, sizeOfLL);
std::cout << "head in main(): " << (long long) LLhead << std::endl;
LLcur = LLhead;
std::cout << "cur in main(): " << (long long) LLcur <<  std::endl;
std::cout <<  "tail in main(): " << (long long) LLtail <<  std::endl;

for (int i = 0; i < sizeOfLL; i++){
    LLcur[i] = 3*i;

}

//LLcur[3]=3;

appendElement(LLtail, 2);
std::cout <<  "tail in main(): " << (long long) LLtail << " value: " << LLtail[0] <<  std::endl;
sizeOfLL = getElementsInList(LLhead, LLtail);
std::cout << sizeOfLL << endl;


for (int i = 0; i < sizeOfLL; i++){
    cout << "cur in main(): " << (long long) &LLcur[i] << " value: " << LLcur[i] << endl;

}

return 0;

这是我的 llist.hpp

void makeLListCstyle(int* &head, int* &tail, int numElements){

    head = (int*) malloc(numElements * sizeof(int));
   // std::cout << "sizeof(int): " << sizeof(int) << endl;
   // std::cout << "head in makeLList(): " <<  (long long) head <<  std::endl;

    tail = head + numElements; // points now at address which is sizeif(int) * numElements further in memory.

   // std::cout <<  "tail in makeLList(): " << (long long) tail <<  std::endl;
   // return head;
}

void appendElement(int* &tail,  int newElement){

    std::cout <<  "tail in appendElement(): " << (long long) tail <<  std::endl;
   tail = tail+1;
    std::cout <<  "tail in appendElement(): " << (long long) tail <<  std::endl;
   // std::cout <<  "value of tail in appendElement(): " << (long long) *tail <<  std::endl;
    *tail = newElement;
   // std::cout <<  "value of tail in appendElement(): " << (long long) *tail <<  std::endl;
}

int getElementsInList(int* &head, int* &tail){
/*
    std::cout <<  "head in getElementsInList(): " << (long long) head <<  std::endl;
    std::cout <<  "tail in getElementsInList(): " << (long long) tail <<  std::endl;
    std::cout << ( (long long)(tail) - (long long)(head) )/ sizeof(int) << endl;
*/
    return ( (long long)(tail) - (long long)(head) ) / sizeof(int);

}

这里是输出。

cur in main(): 18857008 value: 0
cur in main(): 18857012 value: 3
cur in main(): 18857016 value: 6
cur in main(): 18857020 value: 9
cur in main(): 18857024 value: 12
cur in main(): 18857028 value: 0

最后一个应该是 2 而不是 0。我在这里做错了什么?

标签: c++linked-list

解决方案


在你的makeLListCstyle功能中,你做

tail = head + numElements;

这使得tail指向超出分配的内存的一个。

所以appendElement当你这样做时

tail = tail+1;

您正在tail指向超出分配内存末尾的另一个元素,当您随后写入此位置时会导致未定义的行为。


你的代码基本上相当于

int LLHead[5];
// Initialize elements 0 to 4
LLHead[6] = 2;

你所拥有的远不链表。您所拥有的只是一个动态分配的数组,您可以越界。


推荐阅读