比较内存地址

时间:2013-12-09 08:19:55

标签: c arrays pointers memory memory-management

我如何比较固定大小的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

我如何将这些存储到变量中并且它们是可比较的,以便我可以分辨出哪个存储器地址在数组中排在第一位。

另一个问题: 而不是%p如果我做%d打印内存地址我得到:

output:
6296128
6296180

这些有效的内存地址(我的意思是这样安全吗?)

3 个答案:

答案 0 :(得分:11)

十六进制值只是指针中地址的表示。要比较两个指针(指向同一个数组的元素或一个超过数组末尾的元素),您可以使用类似

的代码
if (ptr1 < ptr2)

对于格式说明符,%d不是指针(尽管在某些实现中,它打印正确的值,您不应该使用它),对%p使用void *指针:

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

答案 1 :(得分:3)

0x601240是十六进制表示,6296128十进制表示,是完全相同的数字。同样,0x601274等于62961800x表示后面的内容采用十六进制格式。

在您的C / C ++代码中,可以将ptr1ptr2的值与<>进行比较,以确定哪一个在数组中排在第一位。 (这可以在不担心使用printf表示它们的各种方式的情况下完成。)

答案 2 :(得分:2)

这两个输出是相同的,并且具有相同的值。第一个是十六进制,第二个是十进制。

您可以比较这两个指针和任何其他指针,如果您愿意,也可以对它们进行一些指针运算(减去它们等)。 但是,如果您的程序应该是便携式的,那么这可能非常微妙。例如,检查堆栈是否增大或减少,这可能会改变您想要进行的比较...