给出一个指针p:
char *p ; // Could be any type
Run Code Online (Sandbox Code Playgroud)
假设p正确初始化是以下格式良好:
if (p > 0) // or p > nullptr
Run Code Online (Sandbox Code Playgroud)
更一般地说,当一个操作数是指针而另一个是空指针常量时,使用关系运算符是否良好?
嗨,我确信这一定是一个常见的问题,但是当我搜索它时,我找不到答案.我的问题主要涉及两个方面.我想比较他们的地址,并确定一个是否比另一个大.我希望在比较期间所有地址都是无符号的.这是真的,它在C89,C99和C++之间有所不同吗?当我用gcc编译时,比较是无符号的.
如果我有两个指针,我正在比较这样:
char *a = (char *) 0x80000000; //-2147483648 or 2147483648 ?
char *b = (char *) 0x1;
Run Code Online (Sandbox Code Playgroud)
然后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);
Run Code Online (Sandbox Code Playgroud)
另一个编辑,在阅读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);
Run Code Online (Sandbox Code Playgroud)
感谢大家!