c - 如何遍历结构数组

标签 c arrays struct iteration boundary

在我的应用程序中,我使用了一个结构数组,我需要遍历该数组。正确的做法是什么?如何检查是否已到达数组末尾?

// structure
struct MyData {
  int count;
  char name[20];
  float average;
}

我试过像这样迭代,但我的应用程序崩溃了:

struct MyData data[2] = { {3, "name1", 1.0}, {5, "name2", 2.5} };
struct MyData* ptr = data;

while (*ptr != NULL) {
  // print the contents, works ok for 2 elements

  ptr++; // increment the pointer
}

最佳答案

结构数组是如何分配的

在您的例子中,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]) 计算元素的数量:获取数组的总大小并将其除以单个元素的大小。

这种方法有其缺点。数组声明为指针时不能使用!例如,当我们将数组作为参数传递给函数时,它通常会转换为指针 - 然后我们无法确定数组的大小。

关于c - 如何遍历结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18914960/

相关文章:

c - 获取内存泄漏但分配的内存已被释放

c - 用 C 语言逐个读取句子中的单词

c - 数组内存分配

javascript - Postman - 循环遍历嵌套对象数组以创建变量

无法在内联汇编中声明 .data

c++ - 使 C++ 中结构内部定义的枚举具有全局范围

c - scanf 异常与 %c 和 %s 相关行为

C11 - 将指向结构的指针转换为结构的匿名第一个成员

c - 将struct中的指针设置为C中的数组

c++ - 我可以在不使用点运算符的情况下访问结构内部的结构吗?