我得到了两个结构,一个指向每个结构的指针,一个指向结构指针的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/