c++ - 链表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。我在这里做错了什么?
解决方案
在你的makeLListCstyle
功能中,你做
tail = head + numElements;
这使得tail
指向超出分配的内存的一个。
所以appendElement
当你这样做时
tail = tail+1;
您正在tail
指向超出分配内存末尾的另一个元素,当您随后写入此位置时会导致未定义的行为。
你的代码基本上相当于
int LLHead[5];
// Initialize elements 0 to 4
LLHead[6] = 2;
你所拥有的远不及链表。您所拥有的只是一个动态分配的数组,您可以越界。
推荐阅读
- reactjs - 如何使用来自服务器的数据设置 Context.Provider 值
- reactjs - 在 React 应用程序中使用千位分隔符作为用户类型来格式化输入
- ibm-cloud - 云铸造应用程序的公共互联网端点在哪里?
- python - 将列表中的两个数字相加时出现问题。Python
- python - 无法使用请求从网页中抓取一些静态图片链接
- javascript - 如何在 mongodb 中执行分组,如 lodash 链和 groupby
- c++ - C ++类型的值不能分配给类型的实体
- swift - 使用 @IBInspectable 快速设置 UIView 边框颜色或宽度
- python - 当相应变量不包含在原点中时,使用默认值转换系列中的日期时间格式
- javascript - 在 if 语句中使用数组数据