malloc по какой-то причине не работает - PullRequest
0 голосов
/ 08 мая 2011

Я сделал тип данных:

typedef struct Sale_t *Sale;
struct Sale_t
{
    int license;
    int km_min;
    int km_max;
    int price;
};

Я создаю его с помощью этой функции:

Sale saleCreate(int license, int km_min, int km_max, int price,List sales)
{
    if(saleFind(sales,license)==RENTAL_CAR_ALREADY_ON_SALE)
    {
        return NULL;
    }
    if(km_min<0||km_max<=km_min||price<=0)
    {
        return NULL;
    }
    Sale salePtr = malloc(sizeof(*salePtr));
    if(!salePtr)
    {
        return NULL;
    }
    salePtr->license=license;
    salePtr->km_min=km_min;  //here it crashes
    salePtr->km_max=km_max;
    salePtr->price=price;
    return salePtr;
}

(Не обращайте внимания на Sale и Sale_t; яЯ использую typedef в заголовочном файле, так что это совсем не проблема.)

После некоторого тестирования я обнаружил, что если salePtr->km_min получает любое целое число, отличное от 0, программавылетает.

Что вызывает это?Я уверен, что это как-то связано с malloc() ...

РЕДАКТИРОВАТЬ

Я сделал аналогичный тип данных, который работает ОТЛИЧНО:

typedef struct Car_t *Car;
struct Car_t
{
    int license;
    char* name;
    int price;
    int km;
    int renterId;
};
Car carCreate(int license, char* name, int price, int km, List cars)
{
    if(carFind(cars,license)==RENTAL_CAR_ALREADY_EXISTS)
    {
        return NULL;
    }
    if(km<0||price<=0)
    {
        return NULL;
    }
    Car carPtr = malloc(sizeof(*carPtr));
    if(!carPtr)
    {
        return NULL;
    }
    carPtr->km=km;
    carPtr->license=license;
    carPtr->name=name;
    carPtr->price=price;
    carPtr->renterId=0;
    return carPtr;
}

Ответы [ 3 ]

4 голосов
/ 08 мая 2011

Это неправильно:

Sale salePtr = malloc(sizeof(*salePtr));

Должно (вероятно) быть:

Sale *salePtr = malloc(sizeof(Sale));

Я говорю, вероятно, потому что вы используете Sale, который вы не определяете вкод, который вы вставили, так что это может быть typedef'd для указателя уже типа.

EDIT

Поскольку OP имеет typedef'd Продажа в Sale_t *это должно выглядеть так:

Sale salePtr = malloc(sizeof(Sale_t));
3 голосов
/ 08 мая 2011

Эта строка неверна:

Sale salePtr = malloc(sizeof(*salePtr));

Вы использовали идентификатор salePtr до того, как он был определен (или хорошо, в самом определении).Это должно сработать:

Sale salePtr = malloc(sizeof(*Sale));

Однако, поскольку мы фактически выделяем память для Sale_t, мне это кажется более логичным:

Sale salePtr = malloc(sizeof(Sale_t));
0 голосов
/ 08 мая 2011

Так как в ОП упоминается, что

typedef Sale_t* Sale

было использовано, вот что нужно сделать

Используйте это для alloc

Sale salePtr = (Sale)malloc(sizeof(Sale));

Используйте это для возврата

return salePtr;
...