2

typed配列内のオブジェクトを指すようにポインター演算を使用して初期化された型付きポインター があります。また、2 つのポインター引数を取る関数もあります。1 番目は前述のポインターと同じ型で、2 番目はvoid *(myfunc()以下のコードを参照)。

1 番目の引数として渡し、2 番目の引数typedと同じ型の別のポインターを渡しtyped、関数内でこれらが等しいかどうかを比較すると、未定義の動作になりますか?

#include <stdio.h>

typedef struct S {int i; float f;} s;

void myfunc(s * a, void * b)
{
  if (a == b)  // <-------------------------------- is this UB?
    printf("the same\n");
}

int main()
{
  s myarray[] = {{7, 7.0}, {3, 3.0}};
  s * typed = myarray + 1;
  myfunc(typed, &(myarray[0]));

  return 0;
}

更新:わかりました。上記の質問を投稿した翌日に戻ってきました。2つの素晴らしい回答があります(@SouravGhoshと@dbushの両方に感謝します)。1つは他のものよりも1分も早く(!)到着しましたが、最初のコメントの外観から、最初の回答は間違っていて、2番目の回答が投稿された後にのみ修正されました. どちらを受け入れますか?この場合、ある回答を別の回答よりも受け入れるためのプロトコルはありますか?

4

2 に答える 2