我有一个包含我需要的所有结构的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;
}
每次向列表添加元素时都会调用它。