指向结构体内部结构体的指针;如何访问才不会出错?

Lam*_*sti 0 c struct pointers typedef

据我所知,如果结构体中的项是指针,则使用 来调用它->,如果它是普通值,则使用.

这是我的类型定义:

typedef struct
{
    char name[50];
    int quantity;
}ing;

typedef struct
{
    char name[50];
    ing *n;
    int price, n_ing, max_producity;
}prod;
Run Code Online (Sandbox Code Playgroud)

然后我声明 aprod a;并分配a->n=malloc(n*sizeof(ing));。但是当我尝试访问a.n->name它时出现错误。

所有 4 个组合都会给出错误“错误:‘->’的类型参数无效(有‘prod’(或‘ing’))”或“错误:下标值既不是数组,也不是指针,也不是向量”。

为什么?


    int ret_max_producity(prod a, ing n, int dim_n)
    {
        int max_prod=32100, i;
        for(i=0; i<a.n_ing; i++)
        {
/* here!->*/if((n[find_ing(n, a.n[i]->name, dim_n)].quantity)/(a.n->quantity)<max_prod)
            {
/* here!->*/    max_prod=(n[find_ing(n ,a.n[i]->name, dim_n)].quantity/a.n->quantity);
            }
        }
        if(max_prod==32100)
        {
            printf("ERROR WHILE FINDING MAX PRODUCITY FOR PRODUCT %s, ABORTING", a.name);
            system("pause");
            exit(EXIT_FAILURE);
        }
        return max_prod;
    }
Run Code Online (Sandbox Code Playgroud)
int find_ing(ing v, char *s, int dim)
{
    int i;
    for(i=0; i<dim; i++)
    {
        if(strcmp(s, v.name)==0)
        {
            return i;
        }
    }
    printf("\n\nERROR WHILE FINDING INGREDIENT %s IN VECTOR, ABORTING...", s);
    system("pause");
    exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)

错误

Mik*_*ike 5

As far as I know, if the item inside a structure is a pointer, you call it with ->, if it's a normal value it is used ..

不,该.运算符用于访问结构体的成员,该->运算符是取消引用 和 的快捷方式.,因此如果您有指向结构体的指针,则可以使用它。所以:

ing *n = malloc(sizeof(ing));

n->quantity = 5;   // This is the same as 
(*n).quantity = 5; // this.
Run Code Online (Sandbox Code Playgroud)

从最基本的意义上来说,要访问结构的成员,您可以这样做:

ing n;
n.quanity = 5;
Run Code Online (Sandbox Code Playgroud)

如果声明指向结构的指针,要访问结构的成员,请执行以下操作:

ing *n;
n = malloc(sizeof(ing));
n->quanity = 5;
Run Code Online (Sandbox Code Playgroud)

"prod a; and I allocate a->n=malloc(n*sizeof(ing));. But when I try to access to a->n->name it gives me error"

如果您声明这样的结构,那么它给您带来错误的原因是因为您试图遵循不是指针的东西。

a.n->name
Run Code Online (Sandbox Code Playgroud)

是正确的。

编辑
看到你的代码后我明白你的问题是什么:

* here!->*/if((n[find_ing(n, a.n[i]->name, dim_n)].quantity)/(a.n->quantity)<max_prod)
Run Code Online (Sandbox Code Playgroud)

问题是你所做的取消引用比你想象的要多。正在[i]执行添加和取消引用,然后->正在执行另一个级别的操作。

下面是它的外观的一个简单示例:

prod a;
a.n = malloc(3 * sizeof(ing));  // array of 3 ing structs
a.n[1].quantity = 5;            // access quanity member of ing struct 1
Run Code Online (Sandbox Code Playgroud)

编辑2
这是有问题的行:

* here!->*/if((n[find_ing(n, a.n[i]->name, dim_n)].quantity)/(a.n->quantity)<max_prod)
Run Code Online (Sandbox Code Playgroud)

它应该是这样的:

if((n[find_ing(n, a.n[i].name, dim_n)].quantity)/(a.n->quantity)<max_prod)
Run Code Online (Sandbox Code Playgroud)

编辑3
完全忽略了显而易见的事情。您将一个ing结构传递给该函数,名为n

int ret_max_producity(prod a, ing n, int dim_n)
                                ^
                                | 
                         that's just a single struct totally different than
                       the n that's passed in as a member in the `a` struct
Run Code Online (Sandbox Code Playgroud)

但是,在您的 if 检查中,您尝试将此结构作为数组访问:

n[find_ing(n, a.n[i]->name, dim_n)].quantity
Run Code Online (Sandbox Code Playgroud)

变量中没有结构数组只有一个变量。因此,它会向您大喊大叫,要求您将这个单个结构体视为结构体数组。ingning