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指し、null ではないメモリ不足サイズの配列を指し始めます。次のようなことができます:

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 に答える
0
while(*ptr || ptr->name != NULL)

まず最初に: の値*ptrは構造体であり、ブール値に変換できないため、while(*ptr)コンパイルされません。

構造体の配列を null で終了するには、構造体が初期化されたときに NULL にならないことがわかっている構造体メンバー (通常は重要なポインター) を選択し、それをフラグとして使用する必要があります。あなたはそれを持っています:nameフィールド。

while(ptr->name != NULL)

唯一の問題は、配列が実際には NULL で終了していないことです。文字列の場合と同様に、最後に追加の 3 番目の要素を予約する必要があります。これを行う簡単な方法は、宣言時に配列全体をゼロで初期化することです。そう:

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

手動で設定するのと同じ効果がありますar[2].name = NULL;

于 2013-09-20T09:06:38.020 に答える