首先,我有一个结构:
typedef struct {
int type;
union expr value;
}lval;和联盟的定义如下,以节省空间:
union expr{
long num;
char* err;
char* sym;
sexpr* sexpr1;
};在sexpr*中是
typedef struct {
int count;
struct lval** cell;
}sexpr;我试着用在下面,
void lval_del(lval* v){
lval_del(v->value.sexpr1->cell[i]);
}但是我的编译器给了我一个警告:
参数类型不匹配:不兼容的指针类型'lval *‘和'struct匿名::lval *’。
当我尝试下面的代码时
lval* lval_add(lval* v,lval* x) {
v->value.sexpr1->cell = realloc(v->value.sexpr1->cell, sizeof(lval*)*v->value.sexpr1->count);
v->value.sexpr1->cell[v->value.sexpr1->count-1]=x;
return v;
}我也收到同样的警告。
我忽略了警告并成功地编译了它,但是当我运行它时,它就崩溃了。我认为这是引起警告的问题。我该怎么解决呢?
编辑:我编译的完整代码如下:
typedef struct {
int count;
struct lval** cell;
}sexpr;
union expr{
long num;
char* err;
char* sym;
sexpr* sexpr1;
};
typedef struct {
int type;
union expr value;
}lval;
void lval_del(lval* v){
switch (v->type) {
case LVAL_NUM:
break;
case LVAL_ERR:
free(v->value.err);
break;
case LVAL_SYM:
free(v->value.sym);
break;
case LVAL_SEXPR:
for (int i=0;i<v->value.sexpr1->count;i++){
lval_del(v->value.sexpr1->cell[i]);
}
free(v->value.sexpr1->cell);
default:break;
}
}
lval* lval_add(lval* v,lval* x) {
v->value.sexpr1->count ++;
v->value.sexpr1->cell = realloc(v->value.sexpr1->cell,sizeof(lval*)*v->value.sexpr1->count);
v->value.sexpr1->cell[v->value.sexpr1->count-1]=x;
return v;
}编辑: 7.24我用这个顺序定义了警告。一个复杂的结构对我来说是个噩梦,我放弃了处理指针问题的尝试。下面是我的新代码,仍然带有坏指针。
struct init_lval;
struct init_sexpr;
typedef struct init_sexpr sexpr;
union expr{
long num;
char* err;
char* sym;
sexpr* sexpr1;
};
typedef struct init_lval lval;
struct init_lval
{
int type;
union expr value;
};
struct init_sexpr{
int count;
lval** cell;
};
lval* lval_add(lval* v, lval* x) {
v->value.sexpr1->count ++;
v->value.sexpr1->cell = realloc(v->value.sexpr1->cell,sizeof(lval*)*v->value.sexpr1->count);
v->value.sexpr1->cell[v->value.sexpr1->count-1]=x;
return v;
}
void lval_del(lval* v){
switch (v->type) {
case LVAL_NUM:
break;
case LVAL_ERR:
free(v->value.err);
break;
case LVAL_SYM:
free(v->value.sym);
break;
case LVAL_SEXPR:
for (int i=0;i<v->value.sexpr1->count;i++){
lval_del(v->value.sexpr1->cell[i]);
}
free(v->value.sexpr1->cell);
free(v->value.sexpr1);
default:break;
}
free(v);
}发布于 2018-07-23 08:27:22
struct lval** cell;无效,您没有struct lval,typedef将匿名结构编辑为lval。
将其更改为lval **cell;
您也不会在您的v->value.sexpr1->count函数中增加add,因此它总是写入到相同的位置。
发布于 2018-07-23 09:25:25
这里的问题是房地产。您正在尝试重新分配内存,而内存从未被错误处理过。此外,在像sexpr1这样的表达式中使用内存之前,需要将内存分配给v->value.sexpr1->cell。
试试这个:
lval* lval_add(lval* v,lval* x) {
v->value.sexpr1->count ++;
if(v->value.sexpr1->cell == NULL) {
v->value.sexpr1->cell = malloc(sizeof(lval*)*v->value.sexpr1->count);
} else {
v->value.sexpr1->cell = realloc(v->value.sexpr1->cell,sizeof(lval*)*v->value.sexpr1->count);
}
v->value.sexpr1->cell[v->value.sexpr1->count-1]= (struct lval*)x;
return v;
}并初始化正在传递给lval的lval_add,如下所示:
lval *z = malloc(sizeof(lval));
z->value.sexpr1 = malloc(sizeof(sexpr));
z->value.sexpr1->cell= NULL;希望这能有所帮助!
发布于 2018-07-23 08:57:23
参数类型不匹配:不兼容的指针类型'lval *‘和'struct匿名::lval *’。
以上警告是因为您有一个匿名结构。尝试:
typedef struct lval {
int type;
union expr value;
};这至少可以解决此警告。
https://stackoverflow.com/questions/51474437
复制相似问题