我有一个结构数组,它是动态分配的。指向此数组的指针将传递给其他函数。
struct body{
char* name;
double mass;
// ... some more stuff
};
body *bodies = malloc(Number_of_bodies*sizeof(body));
我需要知道数组的大小,所以我将大小存储在其中一个结构中,该结构位于数组的第0个元素(第一个结构)中。
bodies[0].mass = (double)Number_of_bodies;
然后我从函数返回一个指向数组第一个元素的指针,即bodies[1]
return (bodies+1);
现在,当我在其他函数中使用此指针时,数据应该从第0个元素开始。
body *new_bodies = (bodies+1); //Just trying to show what happens effectively when i pass to another function
new_bodies[0] = *(bodies+1); //I Think
如果我想查看位于bodies[0]
的初始结构,这是否意味着在其他函数中我必须访问new_bodies[-1]
?
这是我能做的吗? 如何访问初始结构?
答案 0 :(得分:11)
是的,您可以使用new_bodies[-1]
来访问数组的初始元素。这是完全合法的。
这背后的原因是指针算术:方括号是写+
的另一种方式,所以当你写new_bodies[-1]
时,它与*(new_bodies-1)
相同。
由于new_bodies
已获得bodies+1
,new_bodies-1
为(bodies+1)-1
或bodies
,因此new_bodies[-1]
与bodies[0]
相同}。
注意:看起来您正试图将元素数量加入到struct
数组的初始元素中,重新定位mass
字段为了它。这将起作用,但它在内存分配(指针name
仍未使用)方面都不是最理想的,但最重要的是在可读性方面。在struct
中使用灵活的数组成员明确存储条目数量会更好:
struct body {
char* name;
double mass;
// ... some more stuff
};
struct bodies {
size_t count;
body bodies[]; // <<== Flexible array member
};
...
bodies *bb = malloc(sizeof(bodies)+Number_of_bodies*sizeof(body));
bb->count = Number_of_bodies;
以下是指向another Q&A with an example of working with flexible array members的链接。