超出C中结构数组的范围

时间:2015-11-23 00:16:18

标签: c struct

假设我声明了以下内容

typedef struct{
    int age;
    int weight;
 } Man;

然后我创建了一个人的数组,如

 Man *manArr = malloc(sizeof(Man) * 2); 

我的理解是我现在有两个单元格,每个单元格都可以包含一个Man类型。但是我怎么能这样做呢?

  manArr[45] = (Man) {33, 23};

我会想象我会因为只存在两个单元而出现故障,但我可以打印manArr [45]的值。例如,通过结构数组,对其字段执行某些操作,然后在没有"超出范围的情况下继续执行下一个操作的好方法是什么?"你说呢? 感谢

2 个答案:

答案 0 :(得分:2)

不保证访问越界不会发生段错误。它由C标准定义为未定义的行为,即任何事情都可能发生,包括看似无错误的行为。

  

例如,通过结构数组,对其字段执行某些操作,然后在没有“超出限制”的情况下继续执行下一个操作,有什么好方法?

记住数组的大小。

const size_t manArrSize = 2;
Man *manArr = malloc(sizeof(Man) * manArrSize); 

for (size_t index = 0; index < manArrSize; ++index)
{
    // Access `manArr[index]`.
}

答案 1 :(得分:1)

超出数组的范围会导致未定义的行为。这意味着任何都可能发生。如果你很幸运,你会得到一个段错误,但你也可能会遇到内存位置恰好位于你可以访问的地方。

至于移动到下一个没有“越界”

您可以使用额外的变量来存储数组的大小,也可以决定数组中的sentinel值(并为其分配一个槽),这样如果某个元素等于sentinel值,知道这是结束。例如,argv使用NULL作为哨兵值。