これは、2 つの C 文字列がメモリ内で重複しているかどうかを確認するための正しい移植可能な方法ですか? 質問する

これは、2 つの C 文字列がメモリ内で重複しているかどうかを確認するための正しい移植可能な方法ですか? 質問する

最も効率的な方法ではないかもしれませんが、それは正しく、移植可能な方法でしょうか?

int are_overlapping(const char *a, const char *b) {
  return (a + strlen(a) == b + strlen(b));
}

明確に言うと、私が探しているのは、メモリ実際のコンテンツではありません。例:

const char a[] = "string";
const char b[] = "another string";
are_overlapping(a, b); // should return 0
are_overlapping(a, a + 3); // should return 1

ベストアンサー1

はい、コードは正しいです。2 つの文字列がサンプルの場所で終了する場合、定義によりそれらは重複しています。つまり、同じヌル終端文字を共有しています。両方の文字列が同一であるか、一方が他方の部分文字列であるかのいずれかです。

プログラムのあらゆる動作は完全に明確に定義されているため、標準に準拠したコンパイラであれば、完全に移植可能であるはずです。

標準規格の関連部分は6.5.9 等価演算子(強調は筆者による):

2つのポインタが等しいかどうかは、どちらもヌルポインタです。どちらも同じオブジェクトへのポインタです(オブジェクトへのポインタとその先頭のサブオブジェクトを含む)または関数、どちらも同じ配列オブジェクトの最後の要素の次の要素へのポインタですまたは、1 つは 1 つの配列オブジェクトの末尾を越えた位置へのポインターであり、もう 1 つはアドレス空間内の最初の配列オブジェクトの直後にある別の配列オブジェクトの先頭へのポインターです。

おすすめ記事