1

我有一个从 和 获得的extern char etext指针end地址edata。我还使用&<Variable Name>. 两者都是十六进制指针地址。

我需要对这些十进制地址进行算术运算。我该怎么做?我需要将地址转换为十进制整数,这样我就可以通过减去地址来找到内存段的大小。

4

4 回答 4

3

数学就是数学。你在什么基础上做这件事并不重要。无论如何,计算机只能在base 2中工作。只有在输入或输出期间,基础才重要。如果将指针解释为指针,则可以对指针进行字节算术char *

ptrdiff_t segmentSize = (char *)segmentEndAddress - (char *)segmentStartAddress;

printf("Segment size in base 10: %td\n", segmentSize);
printf("Segment size in base 16: %tx\n", segmentSize);
printf("Segment size in base  8: %to\n", segmentSize);
于 2013-01-27T16:41:38.403 回答
2

您可以使用指针进行算术运算。请注意,“单位”不是 1,而是指向对象的大小。因此,如果 p 是指向整数的指针,则 p+1 和 p 之间的地址差异可能是 4 个字节或更多。

如果要对地址进行算术运算,则应使用指向 char 的指针或将它们转换为此类指针。

于 2013-01-27T16:45:27.533 回答
1

没有“十六进制变量”,而是可以以某种表示形式打印的变量。此外,该标准不保证 anint可以保存指针对象。如果您使用 C99 或 C11,则可以使用可选类型(u)intptr_t来执行此操作。

uintptr_t n = (uintptr_t)(void *)etext;
于 2013-01-27T16:41:47.867 回答
1

两者都是十六进制指针地址...我需要对这些十进制地址进行算术运算。我该怎么做?

十进制和十六进制只是表示......显示数字的方式。但无论我写的是 10 还是 0xA,它们仍然是相同的数字。指针是一个数字,您可以用十进制或十六进制表示该数字,但它仍然只是一个数字。因此,您可以执行以下操作:

char *foo = "A dog and a cat";
int offset = 4;
char fifthChar = *(foo + offset);

基本上,您将 4 添加到指针foo并取消引用结果,这样就fifthChar可以保存字符“g”。

于 2013-01-27T16:45:45.220 回答