0
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

4 回答 4

4

ptr指向一个数组,如果你增加它,ptr开始指向一个不为空的内存溢出大小的数组。您可以执行以下操作:

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

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

要了解这个公式是什么,请阅读:在 C 中打印数组时的奇怪行为?

于 2013-09-20T07:03:59.120 回答
2

ptr如果您遍历指针数组并且当您知道此类数组的末尾标有 NULL 时,您可以使用检查 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
}
于 2013-09-20T07:04:29.620 回答
1

你可以使用这个:

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

我要指出的另一件事是,char*在使用字符串分配指针之前,您需要为指针分配内存。您编写的最后一个循环根本不执行,因为所有循环都是NULL指针。

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

struct student *arr = (struct student*)malloc(20*sizeof(struct student));
*(arr+19).roll = -1; //this acts as a sentinel to indicate the end of the array....
struct student *ptr=arr;
while(ptr->roll > 0)
{
      //do something...
      ptr++;
}
于 2013-09-20T07:10:40.300 回答
0
while(*ptr || ptr->name != NULL)

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

为了对结构数组进行空终止,您必须选择一些结构成员,当结构初始化时,您知道该成员永远不会为 NULL(通常是重要指针),并将其用作标志。你确实有这个:name领域。

while(ptr->name != NULL)

那么唯一的问题是您的数组实际上并未以 NULL 终止。您需要在末尾保留一个额外的第三个元素,就像使用字符串一样。一个简单的方法是在声明时将整个数组初始化为零。所以:

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

这与手动设置的效果相同ar[2].name = NULL;

于 2013-09-20T09:06:38.020 回答