转换后比较指针值,仍然是相同的等式吗?

时间:2016-02-11 20:28:06

标签: c pointers language-lawyer

在探索字符串转换时,intptr_tuintptr_t就像

一样
void *p;
char sp[100];
snprintf(sp, sizeof sp, "%p, p);
intptr_t ip = (intptr_t) p;

我想知道2指针some_type *a; some_type *b;和它们的等同物在转换时会如何转移。

情况1:两个指针指向相同的位置(对象,对象内的偏移,1-past,函数,数组)但是具有不同的位模式,或者是2个具有不同的空指针位模式。如果有的话,很难在某些平台上创建这种情况。

当然他们比较等于指针(C11§6.5.96)。然而,作为字符串intptr_tuintptr_t,我期望它们是不同的,但认为是相同的是正确的。

  

Q1案例1指针转换(字符串,intptr_tuintptr_t)相同或不同 - 是否符合结果?

案例2(常见情况):所有其他指针对混合但不包括案例1:null,object,object,one-past object,function,...

  

Q2案例2指针a,b:转换为字符串a == bintptr_t时,uintptr_t必须具有相同的结果(使用!strcmp(),{{1 },==)?

使用==打印指针可能没有被正确地称为“转换”,但希望这个想法仍然传达。

测试代码以练习一些可能性。

"%p"

结果。在两个经过测试的平台上,我显然无法创建“有趣的东西!”

void ptr_compare(void *pa, void *pb, 
    bool *pcmp, bool *mcmp, bool *scmp, bool *icmp, bool *ucmp) {

  // pointer compare
  *pcmp = pa == pb;

  // memory compare
  *mcmp = memcmp(&pa, &pb, sizeof pa) == 0;

  // string compare
  char sa[100];
  snprintf(sa, sizeof sa, "%p", pa);
  char sb[100];
  snprintf(sb, sizeof sb, "%p", pb);
  *scmp = !strcmp(sa, sb);

  // signed compare
  intptr_t ia = (intptr_t) pa;
  intptr_t ib = (intptr_t) pb;
  *icmp = ia == ib;

  // unsigned compare
  uintptr_t ua = (uintptr_t) pa;
  uintptr_t ub = (uintptr_t) pb;
  *ucmp = ua == ub;
}

void ptr_test(void *pa, void *pb) {
  bool pcmp, mcmp, scmp, icmp, ucmp;
  ptr_compare(pa, pb, &pcmp, &mcmp, &scmp, &icmp, &ucmp);

  // If same bit pattern ...
  if (mcmp) {
    if (pcmp && scmp && icmp && ucmp) return;
  // else different bit pattern ...
  } else {
    if (!pcmp && !scmp && !icmp && !ucmp) return;
  }

  // Something interesting !
  printf("ptra:%p ptrb:%p --> pcmp:%d mcmp:%d scmp:%d icmp:%d ucmp:%d\n", pa,
      pb, pcmp, mcmp, scmp, icmp, ucmp);
}

int main(void) {
  char p[1];
  void *ptrs[] = { 0, NULL, "123", "123", "456", p, p, main };
  for (size_t ia = 0; ia < sizeof ptrs / sizeof ptrs[0]; ia++) {
    for (size_t ib = 0; ib < sizeof ptrs / sizeof ptrs[0]; ib++) {
      ptr_test(ptrs[ia], ptrs[ib]);
    }
  }
  puts("Done");
  return 0;
}

1 个答案:

答案 0 :(得分:0)

指针的基础值取决于实现。但是在像X86这样的系统上,指针不会因为将其转换为其他类型而改变值。类型是编译时信息,它指向的地址是运行时。该类型会影响编译器生成的代码以进行修改并对其执行数学运算。