检查结构数组的NULL

时间:2013-09-20 06:59:22

标签: c pointers structure

struct student
{
   int roll;
   char *name;
};

int main()
{
  int i;
  struct student arr[2];
  arr[0].roll = 12;
  arr[1].name = "John";

  arr[1].roll = 13;
  arr[1].name = "Craig";

  struct student *ptr;

  ptr=arr;

  // This is perfect.

  for(i = 0; i<2; i++)
  {
    printf("%d %s", ptr->roll, ptr->name);
  }

  // This is also ok.
   printf("%d %s", ptr->roll, ptr->name);

   ptr++ // getting to next structure.

   printf("%d %s", ptr->roll, ptr->name);

  // But this isn't ok

  while(*ptr || ptr->name != NULL)
  {
    ptr++;
  }

  return 0;
}

如何在while循环中检查指针?

4 个答案:

答案 0 :(得分:3)

如果递增它,

ptr指向一个数组,ptr开始指向一个非空的内存输出大小数组。 你可以这样做:

ptr = arr;
while (ptr <  (arr +  sizeof(arr)/sizeof(arr[0])) ){
   ptr++;
}

注意:此技术不适用于动态数组。

要了解有关此公式的内容:Weird behavior when printing array in C?

答案 1 :(得分:2)

如果遍历指针数组并且当您知道此类数组的末尾标记为NULL时,可以使用ptr检查null。你不是。

实际上,您正在遍历一个结构数组,其中ptr指向第一个元素的内存位置。

您必须跟踪数组的大小(或其填充元素的数量),并在完成所有操作后停止。

int count = 2;
struct student arr[count];
struct student* ptr = arr;

for (int i=0; i<count; i++) { 
  // do your stuff

  ptr++; // place it in for if you like
}

答案 2 :(得分:1)

您可以使用:

struct student *ptr=arr;
int max_len = sizeof(arr)/sizeof(*arr);
while(max_len--)
{
    //do something...
    ptr++;
}

我想要指出的另一件事是你需要为char*指针分配内存,然后再用字符串分配它。你写的最后一个循环根本不执行,因为所有都是{ {1}}指针。

其他方法是在数组中最后一个结构的滚动数(比如负值)中加入一些特殊值。然后遍历阵列,直到卷号为正。 请注意,此方法也可用于动态数组。

NULL

答案 3 :(得分:0)

while(*ptr || ptr->name != NULL)

首先要做的事情是:*ptr的值是一个结构,它不能转换为布尔值,因此while(*ptr)将无法编译。

为了对结构数组进行null终止,你必须选择一些结构成员,当初始化结构时(通常是一个重要的指针),你知道它永远不会为NULL,并将它用作标志。你有:name字段。

while(ptr->name != NULL)

然后唯一的问题是你的数组实际上不是NULL终止。你需要在结尾处保留一个额外的第三个元素,就像字符串一样。一种简单的方法是在声明时对整个数组进行零初始化。所以:

struct student arr[3] = {0};
arr[0].roll = 12;
arr[0].name = "John";
...

这与手动设置ar[2].name = NULL;

具有相同的效果