Передача параметров, указатель и проблема адреса - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть некоторые проблемы с передачей параметров в функцию. Пример:

#include <iostream>
using namespace std;

struct VShop
{
    bool index;
    char *fName;
    char *edName;
    char *genre1;
    char *genre2; 
    double rating;
    double price;
};

void AddtoDB (VShop *Film, char *name, char *ed, char *genre1, char *genre2, double rating, double price, int *size, int *element);

int main()
{
    int size = 0, element = 0;
    VShop *Film = new VShop[size];

    AddtoDB(Film, "The Shawshank Redemption", "Frank Darabont", "Crime", "Drama", 9.2, 20, &size, &element);

    cout<<size; // ERROR!

    return 0;
}

void AddtoDB (VShop *Film, char *name, char *ed, char *genre1, char *genre2, double rating, double price, int *size, int *element)
{
    *size++;
    Film[*element].fName = name;
    Film[*element].edName = ed;
    Film[*element].genre1 = genre1;
    Film[*element].genre2 = genre2;
    Film[*element].rating = rating;
    Film[*element].price = price;
    *element=(*element+1);
}

Я получаю ошибку каждый раз, когда хочу получить size или element. Что это происходит? Спасибо.

Ответы [ 3 ]

1 голос
/ 21 сентября 2011

В вашем коде есть несколько ошибок.Во-первых:

VShop *Film = new VShop[size];

size равно 0, что может привести к сбою и не будет работать при попытке доступа к нему.

Во-вторых:

*size++;

++ имеет более высокий приоритет, чем *, поэтому он оценивает:

*(size++);

, в то время как увеличивает размер, а затем разыменовывает old значение размера.Вы, вероятно, хотели:

(*size)++;

, который увеличивает значение int, на которое указывает size.

1 голос
/ 21 сентября 2011

У вас большая проблема с памятью. Посмотрите:

Вы создали массив с нулевым размером:

VShop *Film = new VShop[size];

Затем вы пытаетесь увеличить размер переменную , но не изменили размер массива:

*size++; //must be (*size)++;

Массив по-прежнему имеет нулевую длину, но вы пытаетесь изменить некоторые данные первого (нулевого) элемента:

Film[*element].fName = name;

Вы должны изменить размер массива перед тем, как вставить в него новый элемент:

  1. создать новый массив с правильным размером;
  2. копировать все данные из старого массива в новый;
  3. удалить старый массив;
  4. заменить указатель на старый массив новым.

Другой вариант использует std :: vector.

В любом случае, прочитайте несколько книг об управлении памятью на c ++ и вообще на c ++.

0 голосов
/ 21 сентября 2011

Поскольку ++ имеет больший приоритет, чем *, это выражение эквивалентно * (размер ++).Следовательно, он должен увеличить значение размера (чтобы он теперь указывал на следующий элемент), но поскольку ++ используется в качестве постфикса, все выражение оценивается как значение, указанное исходной ссылкой (адрес, на который указывал указатель).до увеличения).

Попробуйте использовать просто;

(*size)++;

Это приведет к тому, что выражение будет оценено как значение, указанное размером, увеличенным на единицу.

...