假设我声明了以下内容
typedef struct{
int age;
int weight;
} Man;
然后我创建了一个人的数组,如
Man *manArr = malloc(sizeof(Man) * 2);
我的理解是我现在有两个单元格,每个单元格都可以包含一个Man类型。但是我怎么能这样做呢?
manArr[45] = (Man) {33, 23};
我会想象我会因为只存在两个单元而出现故障,但我可以打印manArr [45]的值。例如,通过结构数组,对其字段执行某些操作,然后在没有"超出范围的情况下继续执行下一个操作的好方法是什么?"你说呢? 感谢
答案 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
作为哨兵值。