используя указатели на ряд целых чисел в C ++ - PullRequest
0 голосов
/ 29 декабря 2011

Я пытаюсь создать программу на 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, если я удаляю 4-ю и 5-ю строки из основного метода, я больше не получаю эту проблему, так что она становится проблемой управления памятью.

Что я хочу сделать, это получить значения, указывающие на непрерывный бит памяти с целыми числами. Я пытался использовать для этого массивы, но продолжаю получать только случайные адреса памяти, возвращаемые функцией pop ()

Предыстория: нормальное программирование на Java, я использую C / C ++ только 2 месяца, я использую Eclipse IDE в Ubuntu, я могу очень просто использовать отладчик, но в настоящее время у меня нет функционирующих полос прокрутки в затмении, поэтому я не могу сделать что-то, если они не помещаются на моем экране.

Ответы [ 4 ]

4 голосов
/ 29 декабря 2011

Вы разыменовываете неинициализированный указатель (values) на строку *values = *v;, которая является неопределенным поведением (UB) .Эта строка говорит: «получите целое число, на которое указывает values, и присвойте ему значение, обозначенное v».Проблема с этой логикой в ​​том, что values еще ни на что не указывает.Результатом этого UB является сбой, который вы получаете.

Есть много других проблем с этим кодом, например, передача const int* в конструктор с целью изменения этих значений.Самая большая проблема в том, что это не фактический связанный список.

1 голос
/ 29 декабря 2011

Переменная-член 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
}

Кроме того, почему вы называете это связанным списком, хотя на самом деле вы используете массив памяти для хранения своих номеров?

1 голос
/ 29 декабря 2011
*values = *v;

Вы разыменовываете указатель values в этой строке перед его инициализацией.Это источник более поздних ошибок, и не-ошибки в первых трех строках main просто связаны с удачей.Вы должны выделить пространство через values = new int[n] и освободить его в деструкторе через delete[] values.std::vector делает эту работу чистым и безопасным для вас способом.

1 голос
/ 29 декабря 2011

Возможно, проблема в том, что вы увеличиваете целое число - mypointer, а не указатель.Если целое число требует более одного байта, это может привести к ошибкам.Не могли бы вы попытаться объявить указатель и увеличить его вместо этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...