嗨,我相信这一定是一个常见的问题,但我搜索时找不到答案。我的问题基本上涉及两个指针。我想比较它们的地址,并确定哪一个更大。我期望在比较过程中所有地址都是无符号的。这是真的吗?在C89、C99和C++之间是否有所不同?当我使用gcc编译时,比较是无符号的。
如果我要像这样比较两个指针:
char *a = (char *) 0x80000000; //-2147483648 or 2147483648 ?
char *b = (char *) 0x1;
那么a
是否更大?这是标准保证的吗?
编辑以更新我正在尝试做什么。我有一个情况,我想确定如果有算术错误,它不会导致指针越界。现在我有数组的起始地址和结束地址。如果有错误并且指针计算错误,并且超出了数组内存的有效地址范围,我想确保不会发生访问冲突。我相信我可以通过比较由另一个函数返回的可疑指针,并确定它是否在数组的可接受范围内来防止这种情况发生。正负地址的问题与我在原始问题中讨论的内容有关。
我很感激迄今为止的答案。根据我的编辑,您会说我在gcc和msvc中所做的事情是未定义的行为吗?这是仅在Microsoft Windows上运行的程序。
这是一个过于简化的示例:
char letters[26];
char *do_not_read = &letters[26];
char *suspect = somefunction_i_dont_control(letters,26);
if( (suspect >= letters) && (suspect < do_not_read) )
printf("%c", suspect);
另外修改,阅读了AndreyT的答案后,发现它是正确的。因此我将按照以下方式做:char letters[26];
uintptr_t begin = letters;
uintptr_t toofar = begin + sizeof(letters);
char *suspect = somefunction_i_dont_control(letters,26);
if( ((uintptr_t)suspect >= begin) && ((uintptr_t)suspect < toofar ) )
printf("%c", suspect);
谢谢大家!
type x[2];
,表达式(void *)x < (void *)(x+1)
是成立的。 - cafunsigned char *
以使它们有意义 - 没有定义。在我找到的标准中,这是标准定义的不足之处:许多其他段落_暗示_这将被允许,但从未正式编码为定义行为... - underscore_dstd::less<>
,它将该偏序扩展为完全序。 - Deduplicatormemcpy()
的规则谈论到对象好像是一个"unsigned char数组",但我认为这只是对这样的复制做类比。我找不到问题号,但有一个核心问题寻求澄清它是否意味着一般隐喻。但现在,我看不到减去指针的任何规定,所以唯一可以称之为相当清楚的就是它没有定义...虽然在那个时候,我希望我们能够定义它。我当时非常担心这个问题,但我不得不改变自己的设计,使用实际的数组而不是对象。 - underscore_d