malloc由于某种原因不起作用

时间:2011-05-07 22:23:11

标签: c malloc corrupt

我制作了一种数据类型:

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;
}

(不要介意SaleSale_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 个答案:

答案 0 :(得分:4)

这是错误的:

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

应该(可能)是:

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

我说可能是因为你使用的Sale没有在你粘贴的代码中定义,所以它可能已经被指定为指针类型。

修改

由于OP的typedef'd Sale to Sale_t *,它应该如下所示:

Sale salePtr = malloc(sizeof(Sale_t));

答案 1 :(得分:3)

这一行错了:

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

在定义标识符之前使用了标识符salePtr(或者在定义本身中)。这应该有效:

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

但是,由于我们实际上为Sale_t分配内存,这对我来说似乎更合乎逻辑:

Sale salePtr = malloc(sizeof(Sale_t));

答案 2 :(得分:0)

由于OP提及

typedef Sale_t* Sale
使用

,这是需要做的事情

将此用于alloc

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

将此用作返回

return salePtr;