Как изменить структуру C ++ с помощью int * - PullRequest
0 голосов
/ 05 октября 2011

У меня следующая структура:

struct CountCarrier
{
    int *CurrCount;
};

И вот что я хочу сделать:

int main()
{
    CountCarrier carrier = CountCarrier();
    *(carrier.CurrCount) = 2;  // initialize the *(carrier.CurrCount) to 2
    IncreaseCount(&carrier);  // should increase the *(carrier.CurrCount) to 3
}


void IncreaseCount(CountCarrier *countCarrier)
{
    int *currCounts = countCarrier->CurrCount;
    (*currCounts)++;
}

Итак, мое намерение указано в комментариях.1008 * Однако я не мог заставить это работать.Для начала программа выдает исключение в этой строке:

*(carrier.CurrCount) = 2;

И я подозреваю, что следующая строка также не будет работать.Что-то я не так сделал?

Ответы [ 6 ]

4 голосов
/ 05 октября 2011
    struct CountCarrier 
    {     
        int *CurrCount;  //No memory assigned
    }; 

Вам нужно выделить некоторую допустимую память для указателя внутри структуры, чтобы иметь возможность поместить данные в нее.

Если вы этого не сделаете, то, что вы пытаетесь сделать, это пытаться писать по какому-то недопустимому адресу, что приводит к неопределенному поведению , что в данном случае повезло, что оно является исключением.

Разрешение:

    struct CountCarrier 
    {     
        int *CurrCount;  //No memory assigned
        CountCarrier():CurrCount(new(int))
        {

        }
    }; 

Предложение:
Держитесь подальше от динамических распределений как можно дольше.
Когда вы думаете об использовании указателей, всегда думайте, действительно ли вы нуждаетесь в них. В этом случае на самом деле не кажется, что он вам нужен, простой член int будет в порядке.

1 голос
/ 05 октября 2011

Вам нужно создать указатель. то есть. carrier->CurrCount = new int;

0 голосов
/ 05 октября 2011

Если вы используете C ++, то вам следует обналичить его средства. Вместо того, чтобы исправлять ваш код, я показываю здесь, как должен выглядеть код:

struct CountCarrier
{
  int CurrCount; // simple data member

  CountCarrier(int count) : CurrCount(count) {} // constructor

  CountCarrier& operator ++ ()  // overloaded operator
  {
    ++ CurrCount;
    return *this;
  }
};

Мы перегружаем operator ++, потому что у вас есть только один элемент данных. Вы также можете заменить на некоторый именованный метод, например void IncrementCount().

CountCarrier carrier(2);
++ carrier;
0 голосов
/ 05 октября 2011

Как сказал По словам , вам нужно выделить немного памяти для работы кода.

Но почему это так сложно? Вам не нужны указатели для кода, который вы должны работать. «Современный C ++» выглядит больше так:

struct CountCarrier 
{ 
public:
    CountCarrier(int currCount) : currCount(currCount) {}
    void IncreaseCount() { ++currCount; }
    int GetCount() const { return currCount; }
private:
    int currCount; 
}; 

int main() 
{ 
    CountCarrier carrier(2); // Initialize carrier.currCount to 2 
    carrier.IncreaseCount();  // Increment carrier.currCount to 3
}

Обратите внимание, насколько это чище и меньше подвержено ошибкам. Как я уже сказал, возьмите хорошую вводную книгу по C ++ и прочитайте ее.

0 голосов
/ 05 октября 2011

Я серьезно сомневаюсь, что ваша программа выдает исключение в строке:

*(carrier.CurrCount) = 2;

Хотя выбрасывание исключения, безусловно, допускает поведение, представляется гораздо более вероятным, что вы столкнулись с нарушением доступа, которое вызвалобыть убит операционной системой.

Проблема в том, что вы используете указатель, но ваш указатель не инициализирован, чтобы указывать на что-либо.Это означает, что результат разыменования указателя не определен.

В этой ситуации, похоже, вообще нет никакого преимущества в использовании указателя.Ваш член CurrCount работал бы так же хорошо, если бы он был просто int.

0 голосов
/ 05 октября 2011
*(carrier.CurrCount)

Разыменование указателя carrier.CurrCount, но вы его никогда не инициализировали.Я подозреваю, что это то, что вы хотите:

carrier.CurrCount = new int(2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...