在C语言中访问数组的-1元素

5

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

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]

这是我可以做到的吗? 我如何访问初始结构体?


1
当然可以。为什么不呢?a[b]的定义为*(a+b) - Deduplicator
1
C语言中的负数组索引?密切相关。 - Shafik Yaghmour
1个回答

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字段。这样做是可行的,但是在内存分配(未使用指针名称)和最重要的阅读性方面都不是最佳选择。你最好使用一个带有灵活数组成员的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;

这里是一个链接,指向另一个问题和答案,其中包括使用可变数组成员的例子


这正是我想要做的!这是一个很棒的解决方案。非常感谢! - Rohan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接