c - 指向结构的嵌套指针包含指向包含结构的指针?

标签 c pointers struct unions double-pointer

首先,我有一个结构:

typedef struct {
    int type;
    union expr value;
}lval;

和 union 定义如下以节省空间:

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]); 
}

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

Parameter type mismatch: Incompatible pointer types 'lval *' and 'struct anonymous::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);
}

最佳答案

struct lval** cell; 无效,您没有struct lval,您typedef将匿名结构 >lval.

改成lval **cell;

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

关于c - 指向结构的嵌套指针包含指向包含结构的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51474437/

相关文章:

c - Linux:如何找到持有特定锁的线程?

c - 使用 libavformat 比使用 popen 调用 ffmpeg 更快吗?

c++ - 在C/C++中使用双指针有什么好处

c++ - sigaction : using "void (*sa_sigaction)(int, siginfo_t *, void *);"

c - 访问通过套接字接收的动态分配的结构

c - 与 C 中的浮点值略有混淆。 (cs50 pset1 gredy.c)

C编程: Read all ascii characters from stdin

c - 类型、表达式和数组维度

c++ - 定义char和int时指针有什么区别?

go - 如何将接口(interface) slice 更改为结构 slice