0

我有 2 个结构,一个指向每个结构的指针和一个指向结构指针的 void **stack

我的问题是在线

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

*a是一个变量,每次发生螺柱注册时都会增加 1,所以我不会一遍又一遍地为同一个地址分配内存

因为我stud(&stud)在菜单功能发送地址,然后在输入功能

*ptr2==stud 

因此

stud[*a]== *(stud+*a)== *(*ptr2+*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);
            ...
}
4

2 回答 2

3

这是错误的,因为您需要(大致)赋值左侧的变量,而不是值。你不会写1 = 2;,但你可以写int a; a = 1;。按照同样的逻辑,你不能写&a = (void*)0;.

取消引用指针会为您提供一个变量,因此您可以编写struct student *z = &a; *z = b;.

如果你想写stud[*a] = malloc(...);, 但你没有stud, 只有ptr2, 对于它*ptr2 == stud成立,正确的方法显然是,

(*ptr2)[*a] = malloc(...);

并且(*ptr2)[*a] == *(*ptr2 + *a),所以这也可以:

*(*ptr2+*a) = malloc(sizeof(struct student));
于 2014-03-30T12:42:35.540 回答
1

我的问题在于

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

我要转换 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

两者都是 astruct student并且不能分配malloc()调用的结果。

如果您进行分配,例如,

malloc(10 * sizeof(*stud))

并将其分配给stud*ptr,您可以访问更多。

哦,(*ptr2+*a) == (stud + *a) == &stud[*a] == &(*ptr2)[*a]。但这不是您可以分配的,正如编译器告诉您的那样,这不是左值。即使它不是左值,也不允许您以这种方式访问​​它: while &stud[0]is正是stud&stud[1]指向 onestud指向之后的元素。

只要您没有分配足够的空间以使其存在,这种访问就无法读取,即使写入也无效:您无法更改第二个元素的地址,因为它始终是第一个元素的地址加上sizeof(*stud)字节.

我真的不完全清楚你在做什么;我想你想以错误的方式分配一个数组。

于 2014-03-30T12:47:12.710 回答