我得到了两个结构,一个指向每个结构的指针,一个指向结构指针的void**stack
我的问题就在这条线上

(*ptr2+*a)=(struct student *)malloc(sizeof(struct student));

*a是一个变量,每次螺柱注册时都会增加1,这样我就不会一遍又一遍地为同一个地址分配内存
因为我在菜单功能发送stud(&stud)地址,然后在输入功能发送(*ptr2+*a)地址
*ptr2==stud

因此
stud[*a]== *(stud+*a)== *(*ptr2+*a)

为什么malloc左边的是错误的?
部分代码
struct student
{
    char flag;
    char surname[256];
    int semester;
};

main()
{
    ...
    struct student *stud;
    menu(stack,stackcopy,reversedstack,&prof,&stud,stacksize,&head);
    ...
}

void menu(void **stack,void **stackcopy,void **reversed,struct professor **ptr1,struct student **ptr2,int size,int *head)
{
    ...
    input(stack,ptr1,ptr2,size,head,&a,&b);
    ...
}


int input(void **stack,struct professor **ptr1,struct student **ptr2,int size,int *head,int *a,int *b)
{
            ...
            done=Push(stack,head,(*(int *)ptr2+*a),size);
            (*ptr2+*a)=(struct student *)malloc(sizeof(struct student));
            stud_input(ptr2,a);
            ...
}

最佳答案

我的问题是

(*ptr2+*a)=(struct student *)malloc(sizeof(struct student));

Do I cast the result of malloc?
我修改了这个答案,因为我在第一次尝试时完全错了。在我的头脑中,有一个层面的间接比你实际拥有的更多。
假设您想要malloc()一些条目并将其分配给stud,即将其写入stud实际所在的位置。
如果你想在main()里做,你会做的
struct student *stud = malloc(n * sizeof(*stud));

负责人。
struct student *stud;
stud = malloc(n * sizeof(*stud));

如果您想要有空间来存放n条目。
如果您想在调用的函数中执行相同的操作,则将stud替换为*ptr2
*ptr2 = malloc(n * sizeof(*stud));

似乎您只想在这里分配一个条目。那你就这么做
*ptr2 = malloc(sizeof(*stud));

请注意,您只有一个指针,可以用来访问一个条目(如您所希望的那样)或适当分配的条目数组。
但事实上
stud[*a]== *(stud+*a)== *(*ptr2+*a)

只允许您访问已分配的尽可能多的条目。特别是,如果您只分配了一个条目所需的空间,则只允许使用
stud[0] == *stud

这两个都是struct student调用,不能为其分配malloc()调用的结果。
如果你分配,例如。,
malloc(10 * sizeof(*stud))

并将其分配给stud*ptr,您可以访问更多。
噢,(*ptr2+*a) == (stud + *a) == &stud[*a] == &(*ptr2)[*a]。但是,正如编译器告诉您的,这不是一个左值,您不能将其赋值给它。即使它不是左值,也不允许这样访问它:虽然&stud[0]正好是stud&stud[1]指向stud指向的元素之后的元素。
只要你还没有分配足够的信息,这个访问对于读取来说是无效的,甚至对于写也是无效的:你不能改变第二个元素的地址,因为它总是第一个地址加上sizeof(*stud)字节。
我真的不完全清楚你在做什么;我想你想分配一个数组,并以错误的方式分配给它。

关于c - 使用malloc时的编译器错误(左值需要作为赋值的左操作数),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22743923/

10-11 20:57