c - 指向结构内部结构的指针;如何访问不出错?

标签 c pointers struct typedef

<分区>

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

这里是我的类型定义:

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

typedef struct
{
    char name[50];
    ing *n;
    int price, n_ing, max_producity;
}prod;

然后我声明一个 prod a; 并分配 a->n=malloc(n*sizeof(ing));。 但是当我尝试访问 a.n->name 时,它给了我错误。

所有 4 种组合都给我错误“错误:'->' 的无效类型参数(具有'prod'(或'ing'))”或“错误:下标值既不是数组也不是指针也不是 vector ”。

为什么?


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

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

The errors

最佳答案

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

不,. 运算符用于访问结构的成员,-> 运算符是解引用和. 的快捷方式>,所以如果你有一个指向你的结构的指针,你就可以使用它。所以:

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

n->quantity = 5;   // This is the same as 
(*n).quantity = 5; // this.

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

ing n;
n.quanity = 5;

如果您声明一个指向您的结构的指针,要访问该结构的成员,您可以这样做:

ing *n;
n = malloc(sizeof(ing));
n->quanity = 5;

“prod a; 并且我分配了 a->n=malloc(n*sizeof(ing));。但是当我尝试访问 a->n->name 时它给了我错误”

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

a.n->name

是正确的。

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

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

问题是您进行的取消引用比您想象的要多。 [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

编辑 2
这是有问题的行:

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

这是应该的:

if((n[find_ing(n, a.n[i].name, dim_n)].quantity)/(a.n->quantity)<max_prod)

编辑 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

但是在你的 if 检查中,你正试图将这个结构作为数组访问:

n[find_ing(n, a.n[i]->name, dim_n)].quantity

没有n 变量中有一个ing 结构数组,您只有一个ing 变量。所以它对你大喊大叫,因为你将这个单一结构视为一个结构数组。

关于c - 指向结构内部结构的指针;如何访问不出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16487861/

相关文章:

c - 结构体中的指针放置在两个结构体成员上

c - osx - 在分配的内存页上写入和执行

c - 在使用 gdb 运行 exucatble 时使用断点时会在某些地方发生中断

c - fgets 无法正常工作

C++使用唯一指针隐式删除类

c++ - char* 和 new 的一些错误

c++ - C/C++ 中的套接字编程 - 接收由 typedef 结构定义的消息

c - **在指针中的意义-C语言

c - C语言读取文件的困境

c - "int * * k"是什么意思?