首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套指针到结构包含指向包含结构的指针?

嵌套指针到结构包含指向包含结构的指针?
EN

Stack Overflow用户
提问于 2018-07-23 08:23:01
回答 3查看 126关注 0票数 0

首先,我有一个结构:

代码语言:javascript
复制
typedef struct {
    int type;
    union expr value;
}lval;

和联盟的定义如下,以节省空间:

代码语言:javascript
复制
union expr{
    long num;
    char* err;
    char* sym;
    sexpr* sexpr1;
};

sexpr*中是

代码语言:javascript
复制
typedef struct {
    int count;
    struct lval** cell;
}sexpr;

我试着用在下面,

代码语言:javascript
复制
void lval_del(lval* v){
     lval_del(v->value.sexpr1->cell[i]); 
}

但是我的编译器给了我一个警告:

参数类型不匹配:不兼容的指针类型'lval *‘和'struct匿名::lval *’。

当我尝试下面的代码时

代码语言:javascript
复制
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;
}

我也收到同样的警告。

我忽略了警告并成功地编译了它,但是当我运行它时,它就崩溃了。我认为这是引起警告的问题。我该怎么解决呢?

编辑:我编译的完整代码如下:

代码语言:javascript
复制
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我用这个顺序定义了警告。一个复杂的结构对我来说是个噩梦,我放弃了处理指针问题的尝试。下面是我的新代码,仍然带有坏指针。

代码语言:javascript
复制
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);
}
EN

回答 3

Stack Overflow用户

发布于 2018-07-23 08:27:22

struct lval** cell;无效,您没有struct lvaltypedef将匿名结构编辑为lval

将其更改为lval **cell;

您也不会在您的v->value.sexpr1->count函数中增加add,因此它总是写入到相同的位置。

票数 1
EN

Stack Overflow用户

发布于 2018-07-23 09:25:25

这里的问题是房地产。您正在尝试重新分配内存,而内存从未被错误处理过。此外,在像sexpr1这样的表达式中使用内存之前,需要将内存分配给v->value.sexpr1->cell

试试这个:

代码语言:javascript
复制
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;
}

并初始化正在传递给lvallval_add,如下所示:

代码语言:javascript
复制
lval *z = malloc(sizeof(lval));
z->value.sexpr1 = malloc(sizeof(sexpr));
z->value.sexpr1->cell= NULL;

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2018-07-23 08:57:23

参数类型不匹配:不兼容的指针类型'lval *‘和'struct匿名::lval *’。

以上警告是因为您有一个匿名结构。尝试:

代码语言:javascript
复制
typedef struct lval {
    int type;
    union expr value;
};

这至少可以解决此警告。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51474437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档