C-一个不断崩溃的ADT

时间:2015-11-17 16:12:56

标签: c adt

我正在尝试制作ADT, 首先,这是关于它的基本信息:

typedef struct orange_t* Orange;

typedef enum {
JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC,
} Month;

struct orange_t {

short size;
Month expirationMonth;
char** foodCompanies;
int maxNumberOfFoodCompanies;
int sellingPrice;
};

现在我试图创建一个“创建”新橙色的功能:

Orange orangeCreate(short size,Month expirationMonth
    ,int maxNumberOfFoodCompanies,int sellingPrice)
 {
   Orange new_orange=(Orange)malloc(sizeof(struct orange_t));
   if(new_orange==NULL)
   {
        return NULL;
    }
   if((sellingPrice<0)||(size>256||size<1)||(maxNumberOfFoodCompanies<0)||(expirationMonth>12)
        ||(expirationMonth<1))
        {
        return NULL;
        }
new_orange->sellingPrice=sellingPrice;
new_orange->maxNumberOfFoodCompanies=maxNumberOfFoodCompanies;
new_orange->expirationMonth=expirationMonth;
new_orange->size=size;
for(int i=0;i<new_orange->maxNumberOfFoodCompanies;i++)
{
    new_orange->foodCompanies[i]=NULL;
}
return new_orange;
}

当我尝试使用简单main()检查函数时:

int main()
{
Orange orange=orangeCreate(3,JAN,10,4);
printf("the size is %d\n",orange->size);
orangeDestroy(orange);
return 0;
}

程序一直在崩溃,我想我没有像我应该那样更改橙色的值,它们可能仍然是NULL。 我在哪里错了?

3 个答案:

答案 0 :(得分:1)

如果JAN您从expirationMonth<1返回NULL,则

orangeCreate为0.

另外:您没有检查orangeCreate的返回值。当你刚刚orangeCreate没有NULL分配的free时,你就会在new_orange内泄漏记忆。

答案 1 :(得分:1)

问题在于您没有为char** foodCompanies;

分配内存

在这里分配内存

Orange new_orange=malloc(sizeof(struct orange_t));

您已为指针变量char** foodCompanies;分配了空间,但尚未分配指向它的空间。

答案 2 :(得分:1)

在访问之前,您必须分配一些内存并将其地址存储到new_orange->foodCompanies

可能的解决方法:

Orange orangeCreate(short size,Month expirationMonth
    ,int maxNumberOfFoodCompanies,int sellingPrice)
 {
   Orange new_orange=malloc(sizeof(struct orange_t));
   if(new_orange==NULL)
   {
        return NULL;
    }
   if((sellingPrice<0)||(size>256||size<1)||(maxNumberOfFoodCompanies<0)||(expirationMonth>12)
        ||(expirationMonth<1))
        {
        return NULL;
        }
new_orange->sellingPrice=sellingPrice;
new_orange->maxNumberOfFoodCompanies=maxNumberOfFoodCompanies;
new_orange->expirationMonth=expirationMonth;
new_orange->size=size;
new_orange->foodCompanies=malloc(sizeof(char*)*new_orange->maxNumberOfFoodCompanies); /* add this line */
for(int i=0;i<new_orange->maxNumberOfFoodCompanies;i++)
{
    new_orange->foodCompanies[i]=NULL;
}
return new_orange;
}

注意:不鼓励在{C.}中投射malloc()的结果 c - Do I cast the result of malloc? - Stack Overflow