2013-12-09 149 views
4

如何比较固定大小的char数组中的两个内存地址?可以说我有两个指针,每个指向数组在不同的存储位置:比较内存地址

char *ptr1; //points to a memory address in the array; 
char *ptr2; //points to another memory address in the array; 

如果我这样做printf("%p\n%p\n", ptr1, ptr2);然后将打印内存地址为十六进制。

output: 
0x601240 
0x601274 

我如何将存储到这些变量,它们是可比的,这样我可以告诉它的内存地址是第一位在数组中。

另一个问题: 如果我做的%d打印内存地址,我收到%P代替:

output: 
6296128 
6296180 

是这些有效的内存地址,以及(我的意思是这样的安全使用)?

回答

11

十六进制值只是指针中地址的表示。为了两个指针比较(即指向同一个数组或一个过去的数组末尾的元素),你可以使用如下代码

if (ptr1 < ptr2) 

至于格式说明%d不是指针(尽管在一些实现,它打印正确的值,你不应该使用它),使用%pvoid *指针:

printf("%p\n%p\n", (void *)ptr1, (void *)ptr2); 
+0

如果我知道内存地址停在0x700000(为了争辩),我想检查指针是否指向允许的范围之外? 'if(ptr1> 0x700000)返回-1;'有效? – mfloris

3

0x601240是十六进制表示,并6296128十进制表示,相同数量的。同样,0x601274等于62961800x表示接下来是十六进制格式。

在您的C/C++代码,的ptr1ptr2的值可以与<>比较,以确定哪一个至上在数组中。 (这可以完成而不用担心它们可以用printf表示的各种方式。)

+0

虽然使用'%d'碰巧在本例中显示地址的十进制值,但是使用'%d'格式化指针时的行为不是由C标准定义的,并且通常不安全它。 –

2

这两个输出是相同的,并且具有相同的值。第一个是六进制,第二个是十进制。如果你愿意的话,你可以比较这两个指针和任何其他的指针,你也可以对它们进行一些指针运算(减去它们等等)。 但是,如果你的程序应该是便携式的,这可能是非常微妙的。例如,检查堆栈增长或减少,这可能会改变你想要做的比较...

+0

只要这些指针在同一个数组中,没有什么会改变这种比较。 – glglgl

+0

是的,我错过了他提到它指向同一阵列上的对象的部分。尽管如此,我认为提及这一点很重要,因为在更一般的情况下,您需要考虑这一点。 – yosim