在探索字符串转换时,intptr_t
和uintptr_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_t
或uintptr_t
,我期望它们是不同的,但认为是相同的是正确的。
Q1案例1指针转换(字符串,
intptr_t
,uintptr_t
)相同或不同 - 是否符合结果?
案例2(常见情况):所有其他指针对混合但不包括案例1:null,object,object,one-past object,function,...
Q2案例2指针
a,b
:转换为字符串a == b
,intptr_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;
}
答案 0 :(得分:0)
指针的基础值取决于实现。但是在像X86这样的系统上,指针不会因为将其转换为其他类型而改变值。类型是编译时信息,它指向的地址是运行时。该类型会影响编译器生成的代码以进行修改并对其执行数学运算。