我有一个从 和 获得的extern char etext
指针end
地址edata
。我还使用&<Variable Name>
. 两者都是十六进制指针地址。
我需要对这些十进制地址进行算术运算。我该怎么做?我需要将地址转换为十进制整数,这样我就可以通过减去地址来找到内存段的大小。
我有一个从 和 获得的extern char etext
指针end
地址edata
。我还使用&<Variable Name>
. 两者都是十六进制指针地址。
我需要对这些十进制地址进行算术运算。我该怎么做?我需要将地址转换为十进制整数,这样我就可以通过减去地址来找到内存段的大小。
数学就是数学。你在什么基础上做这件事并不重要。无论如何,计算机只能在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);
您可以使用指针进行算术运算。请注意,“单位”不是 1,而是指向对象的大小。因此,如果 p 是指向整数的指针,则 p+1 和 p 之间的地址差异可能是 4 个字节或更多。
如果要对地址进行算术运算,则应使用指向 char 的指针或将它们转换为此类指针。
没有“十六进制变量”,而是可以以某种表示形式打印的变量。此外,该标准不保证 anint
可以保存指针对象。如果您使用 C99 或 C11,则可以使用可选类型(u)intptr_t
来执行此操作。
uintptr_t n = (uintptr_t)(void *)etext;
两者都是十六进制指针地址...我需要对这些十进制地址进行算术运算。我该怎么做?
十进制和十六进制只是表示......显示数字的方式。但无论我写的是 10 还是 0xA,它们仍然是相同的数字。指针是一个数字,您可以用十进制或十六进制表示该数字,但它仍然只是一个数字。因此,您可以执行以下操作:
char *foo = "A dog and a cat";
int offset = 4;
char fifthChar = *(foo + offset);
基本上,您将 4 添加到指针foo
并取消引用结果,这样就fifthChar
可以保存字符“g”。