Skip to content

Cのポインタは由来を考慮する

Cのポインタは どこから作られたのか を考慮する場合があるので、同じアドレスであっても同値と扱わないことがある。これをポインタのprovenance1という。

例えば以下のコードでは

#include <stdio.h>
int
main(void)
{
long n, *p1;
long v, *p2;
p1 = &n;
p1++;
p2 = &v;
printf("p1 = %p; p2 = %p; %d\n", p1, p2, p1 == p2);
return 0;
}

GCC 14で試したところ、provenanceが常に有効となる訳ではなく、最適化オプションを付けると有効になるらしい。

Terminal window
$ cc main.c
$ ./a.out
p1 = 0x7ffff7da73e0; p2 = 0x7ffff7da73e0; 1
$ cc -O1 main.c
$ ./a.out
p1 = 0x7fff056f1030; p2 = 0x7fff056f1030; 0
  1. provenanceは出自とか由来といった意味を持つ単語