C语言 如何在使用递归数据结构实现树时避免此错误?“需要左值作为赋值的左操作数”

cgfeq70w  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(131)

尝试执行此操作时:g->v+i=aux;,我得到:
错误:需要左值作为赋值的左操作数”
g->v是指向动态分配的子数组的指针。
即使为数组分配了空间,编译器也不喜欢我递增指针。

int n=5
struct group
{
    int n,x,y,exp,r;
    struct group *v;
};
void init_group(struct group *g)
{
    g->v=malloc(sizeof(struct group*)*(n));//an array of n elements
    for(int i=0; i<n; i++)
    {
            struct group *aux;
            g->v+i=aux; **// HERE IS THE ERROR**
    }
}

我做错了什么?我可以使用什么替代方案?

ua4mk5z4

ua4mk5z41#

首先,您的v成员是一个struct group*,这将允许它保存一个 structures 数组;但是您分配它(并试图分配它)的方式就好像它是指向结构的指针数组一样。
因此,如果malloc调用正在执行您实际希望它执行的操作(即创建一个n指针数组),则该成员应声明为指针到指针:struct group** v; .
第二,在访问数组元素时,不要使用指针运算,以免混淆:这就是[]运算符的作用一个简单的g->v[i] = aux;就可以完成这项工作。
以下是代码的修改/工作版本:

#include <stdio.h>
#include <stdlib.h>

int n = 5;
struct group
{
    int n, x, y, exp, r;
    struct group** v; // Double pointer to hold an array of POINTERS
};

void init_group(struct group* g)
{
    g->v = malloc(sizeof(struct group*) * (n));//an array of n elements
    for (int i = 0; i < n; i++)
    {
        struct group* aux = NULL; // Actually give a value?
        g->v[i] = aux; // Use the array's [] operator
    }
}

如果您确实 * 坚持 * 使用指针算术,而不是[]运算符,那么(在将成员类型更正为指针到指针之后),语法如下所示:

*(g->v + i) = aux;

相关问题