繁体   English   中英

在c中访问数组的-1元素

[英]Accessing the -1 element of an array in c

我有一个结构数组,它是动态分配的。 指向此数组的指针将传递给其他函数。

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]

这是我能做的吗? 我如何访问初始结构?

是的,您可以使用new_bodies[-1]来访问数组的初始元素。 这是完全合法的。

这背后的原因是指针算术:方括号是写+另一种方式,因此当你编写new_bodies[-1]它与*(new_bodies-1)

由于new_bodies已经作为bodies+1获得, new_bodies-1(bodies+1)-1bodies ,使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;

以下是另一个Q&A的链接, 其中包含使用灵活数组成员的示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM