相关疑难解决方法(0)

鉴于p是一个指针是"p> nullptr"格式良好?

给出一个指针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)

更一般地说,当一个操作数是指针而另一个是空指针常量时,使用关系运算符是否良好?

c++ pointers language-lawyer c++11 c++14

21
推荐指数
1
解决办法
852
查看次数

C中的指针比较是签名还是未签名?

嗨,我确信这一定是一个常见的问题,但是当我搜索它时,我找不到答案.我的问题主要涉及两个方面.我想比较他们的地址,并确定一个是否比另一个大.我希望在比较期间所有地址都是无符号的.这是真的,它在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)


感谢大家!

c comparison pointers

15
推荐指数
2
解决办法
1万
查看次数

标签 统计

pointers ×2

c ×1

c++ ×1

c++11 ×1

c++14 ×1

comparison ×1

language-lawyer ×1