结构数组是如何分配的
在您的情况下,MyData[2] 数组在内存中如下所示:
| count | name | average | count | name | average |
^ -- your ptr points here
这是一个大小为2 * sizeof (struct MyData)的单个连续空间。
每当您执行ptr++ 操作时,指针都会移动到数组中的下一个结构,这意味着它会考虑单个struct MyData 的大小。
| count | name | average | count | name | average |
^ -- after ptr++ your ptr points here
在另一个ptr++ 之后,您的指针将指向内存就在您的数组之后。
| count | name | average | count | name | average |
^ -- another ptr++ and your ptr points here
当您取消引用 ptr 指针时,您访问的内存尚未使用甚至未分配。这是未定义的行为,因此您的应用程序会崩溃。
如何迭代?
有几种方法可以做到这一点。请注意,并非所有方法都适用于所有情况。
一个简单的
我们通常只知道数组的大小。然后我们可以使用普通的for 循环来迭代内容。
int len = 2;
struct MyData data[len] = { {3, "name1", 1.0}, {5, "name2", 2.5} };
struct MyData* ptr = data;
for (int i=0; i<len; i++, ptr++ ) {
// do your thing with the ptr
// and note that ptr gets increased inside for
}
使用 sizeof 确定数组长度
struct MyData data[2] = { {3, "name1", 1.0}, {5, "name2", 2.5} };
struct MyData* ptr = data;
struct MyData* endPtr = data + sizeof(data)/sizeof(data[0]);
while ( ptr < endPtr ){
// do your thing with the ptr
ptr++;
}
sizeof(data)/sizeof(data[0]) 计算元素的数量:获取数组的总大小,然后除以单个元素的大小。
这种方法有其缺点。数组声明为指针时不能使用!例如,当我们将数组作为参数传递给函数时,它通常会转换为指针 - 然后我们无法确定数组的大小。