Roh*_*han 5 c arrays struct pointers dynamic
我有一个结构数组,它是动态分配的.指向此数组的指针将传递给其他函数.
struct body{
char* name;
double mass;
// ... some more stuff
};
body *bodies = malloc(Number_of_bodies*sizeof(body));
Run Code Online (Sandbox Code Playgroud)
我需要知道数组的大小,所以我将大小存储在其中一个结构中,它位于数组的第0个元素(第一个结构)中.
bodies[0].mass = (double)Number_of_bodies;
Run Code Online (Sandbox Code Playgroud)
然后我从函数返回一个指向数组的第一个元素的指针,即 bodies[1]
return (bodies+1);
Run Code Online (Sandbox Code Playgroud)
现在,当我在其他函数中使用此指针时,数据应该从第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
Run Code Online (Sandbox Code Playgroud)
如果我想看到初始结构,那是bodies[0]
什么意思,在我必须访问的其他函数中意味着new_bodies[-1]
什么?
这是我能做的吗?我如何访问初始结构?
das*_*ght 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;
Run Code Online (Sandbox Code Playgroud)
以下是另一个Q&A的链接,其中包含使用灵活数组成员的示例.