我制作了一种数据类型:
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;
}
答案 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;