在C++中使用指向一系列整数的指针

using Pointers to a series of integers in C++

本文关键字:一系列 整数 指针 C++      更新时间:2023-10-16

我正在尝试创建一个 c++ 程序,其中包含一个在"堆"上保存整数并且只有一个方法 pop((,它返回类中的第一项并将其删除。这是我到目前为止的代码:

#include <iostream>
using namespace std;
class LinkList {
int *values; //pointer to integers stored in linklist
int number; // number of values stored in linklist
public:
LinkList(const int*, int); // Constructor (method declaration)
int pop(); // typically remove item from data structure (method declaration)
};
LinkList::LinkList(const int *v, int n){
number = n;
*values = *v;
int mypointer = 1;
while (mypointer<n) {
    *(values+mypointer) = *(v+mypointer);
    mypointer++;
}
}

int LinkList::pop() {
if (number>0) {
    int returnme = *values; //get the first integer in the linklist
    number--;
    values++; //move values to next address
    return returnme;
}
else {return -1;}
}

int main() {
int test[] = {1,2,3,4,5};
LinkList l1(test,5);
cout << l1.pop() << endl;
LinkList l2(test,5);
cout << l2.pop() << endl;
return 0;
}

问题是它在 *values = *v 行处失败,如果我从 main 方法中删除第 4 行和第 5 行,我不再遇到这个问题,所以它变成了内存管理的事情。

我想做的是让值指向带有整数的连续内存位。我尝试为此使用数组,但一直只获取 pop(( 返回的随机内存地址

背景:正常的我用java编程,我只使用C/C++2个月,我在ubuntu中使用eclipse IDE,我可以非常基本地使用调试器,但目前我在eclipse中没有功能滚动条,所以如果它们不适合我的屏幕,我就不能做点什么。

您正在取消引用未初始化的指针 ( values ( 在第 *values = *v; 行,这是未定义的行为 (UB(。 这一行所说的是"获取values指向的整数,并为其分配v指向的值"。这种逻辑的问题在于values还没有指向任何东西。此 UB 的结果是您收到的崩溃。

此代码还有许多其他问题,例如将const int*传递给构造函数以修改这些值。最大的问题是这不是一个实际的链表。

*values = *v;

在初始化此行中的values指针之前,取消引用它。这就是后来错误的源头,main前三行的非错误只是运气好。您必须通过values = new int[n]分配空间,并通过delete[] values在析构函数中释放空间。 std::vector以干净且异常安全的方式为您完成这项工作。

也许问题是你正在增加一个整数 - mypointer,而不是一个指针。如果整数需要多个字节的空间,则可能会导致错误。你能尝试声明一个指针并增加它吗?

values成员变量是指向未初始化内存的指针。在开始将数字复制到其中之前,您必须将其指向有效内存。例如:

LinkList::LinkList(const int *v, int n){
    number = n;
    values = new int[n]; // allocate memory
    int mypointer = 0;
    while (mypointer<n) {
        *(values+mypointer) = *(v+mypointer);
        mypointer++;
    }
}
LinkList::~LinkList() {
    delete values; // release memory
}

另外,为什么你称之为链表,而实际上你正在使用内存数组来存储你的数字?