1

通过知道变量的地址,我并没有得到处理变量字节大小的全部目的。例如,假设我知道 int 变量存储在哪里,假设它存储在 address 中0x8C729A09,如果我想获取存储在该地址中的 int ,我可以取消引用该地址并获取存储在其上的数字。

那么,知道变量字节大小的目的究竟是什么?为什么变量是否具有4 bytes(存在int)或者8 bytes我是否能够通过取消引用来获取变量的值address?我问这个,因为我正在取消引用某个地址,我认为我需要通过一个 for 循环来获取变量(通过知道起始地址,即变量的地址,以及变量的大小以字节为单位),但每当我这样做时,我只会得到其他也被声明的变量。

一点上下文:我正在开发一个名为 Pin 的工具,并获取在另一个程序中声明的全局变量的地址。

for 案例看起来像这样:

for(address1 = (char *) 0x804A03C, limit = address1 + bytesize; address1 < limit; address1++)
      cout <<  *(address1) << "\n";
4

3 回答 3

4

Michael Krelin 给出了一个非常简洁的答案,但我认为我可以进一步扩展它。

在任何语言中,不仅仅是 C 语言,出于各种原因,您都需要知道大小:

  • 这决定了可以存储的最大值
  • 这些值的数组将占用的内存空间(1000 个字节将为您提供 250 个整数或 125 个长整数)。
  • 当您想将一个值数组复制到另一个数组中时,您需要知道使用了多少字节来分配足够的空间。
  • 虽然您可以取消引用指针并获取值,但您可以在该值的不同部分取消引用指针,但前提是您知道它由多少字节组成。您可以通过仅获取前两个字节来获取 int 的高值,并通过获取最后两个字节来获取低值。
  • 不同的架构可能对不同的变量有不同的大小,这会影响上述所有点。

编辑:

此外,您可能需要知道给定变量的位数肯定是有原因的。如果您想要 32 个布尔值,有什么比使用 32 位的单个 int 更好的变量呢?然后您可以使用一些常量来创建指向每个位的指针,现在您有了一个布尔“数组”。这些通常称为位域(如果我错了,请纠正我)。在编程中,每一个细节都很重要,但并非所有应用程序都如此。只是想这可能是一个有趣的思考练习。

于 2012-09-25T21:01:52.353 回答
1

答案很简单:大多数类型的内部表示需要不止一个字节。为了取消引用指针,您(您或编译器)需要知道应该读取多少字节。

在使用字符串时也要考虑它,你不能总是在 terminating 上中继\0,因此你需要知道你必须读取多少字节。这些示例是类似memcpyor的函数strncmp

于 2012-09-25T21:45:27.900 回答
0

假设你有一个变量数组。在不知道其大小的情况下,您在哪里找到非零索引处的变量?你为非零长度的变量数组分配了多少字节?

于 2012-09-25T20:42:33.397 回答