C - mallocing包含各种变量的结构给出了段错误

时间:2016-11-25 09:50:24

标签: c segmentation-fault malloc structure

我有一个包含我需要的所有结构的typedef:

typedef struct item {

    Data_type type;
    union {
        int i;
        double d;
        char *s;
        symt_var *ptr;  
    } value;


    enum op op;
    struct item *lptr;
    struct item *rptr;
} item;

当我第一次在堆上为它分配空间时,没关系,但是因为malloc是迭代的,所以为新的项目分配了新的空间'每次我总是在malloc的第二次迭代中得到奇怪的分段错误。它有更奇怪的解决方案(现在,我确定它不是解决方案 - 但它确实有效),当我这样做时

item *new_item = malloc(sizeof(item)+1);

而不是

item *new_item = malloc(sizeof(item));

无论如何,它每次都会以某种方式运作。为什么需要一个额外的字节?如何在以后免费使用?有没有合理的方法来计算结构的实际尺寸? 当我这样做时:

sizeof(double)+sizeof(Data_type)+sizeof(op)+(sizeof(item*)*2)

我得到32岁。

sizeof(item)   // = 40

我需要41 ......

我在没有+1的情况下发生崩溃的相关代码:

void list_add(tPsa_stack *Psa_stack, enum op op)    // 
{
    item *new_item = malloc(sizeof(item)+1);    //alokace noveho itemu
    if (new_item == NULL)
    {
        printErr(ALLOCERROR, INTERNERR);
    }

    new_item->op = op;
    new_item->lptr = NULL;
    new_item->rptr = Psa_stack->top;    // pridani na vrchol zasobniku

    if(Psa_stack->top != NULL)
        Psa_stack->top->lptr = new_item;

    Psa_stack->top = new_item;
}

每次向列表添加元素时都会调用它。

0 个答案:

没有答案