我们如何从给定的内存指针中找到MEMORY SIZE?

时间:2010-10-03 18:30:47

标签: c

void func( int *p)
{
  // Add code to print MEMORY SIZE which is pointed by pointer P.
}
int main()
{
  int *p = (int *) malloc (10);
  func(p);
}

如何从func()中的内存指针P找到MEMORY SIZE?

5 个答案:

答案 0 :(得分:10)

在C语言中没有合法的方法(或者我相信C ++)。是的,某种程度上free知道malloc多少是{{1}},但它是以程序员看不到或无法访问的方式进行的。对于程序员来说,它可能也是通过 magic 来完成的!

如果您决定尝试解码malloc和free所做的事情,那么它将引导您前往专有编译器实现。请注意,即使在相同的操作系统上,不同的编译器(甚至是同一编译器的不同版本,甚至是相同的编译器,但使用第三方malloc实现(是的,存在这样的东西))都可以以不同的方式进行。

答案 1 :(得分:3)

在开发应用程序时,要知道分配给指针的内存大小,我们实际上会在为它分配内存时注意,在你的情况下是:

int *p = (int *) malloc(10);

如果我们将来需要使用它,我们会将这些信息存储在某个地方。像这样:

void func(int *p, size_t size)
{
  printf("Memory address 0x%x has %d bytes allocated for it!\n", p, size);
}

int main()
{
  int my_bytes = 10;
  int *p = malloc(my_bytes);
  func(p, my_bytes);

  return 0;
}

答案 2 :(得分:2)

许多年前,我在类似UNIX的系统上进行了编程,该系统具有msize stdlib函数,可以返回您想要的内容。不幸的是,它从未成为任何标准的一部分。

msize调用从mallocrealloc返回的指针将返回系统为该地址的用户程序分配的实际内存量(可能超过请求,如果它因对齐原因或其他原因而被四舍五入。)

答案 3 :(得分:1)

如果为Microsoft Windows编程,则可以使用Windows API Heap *函数而不是编程语言提供的函数(在您的情况下为C)。您使用HeapAlloc分配内存,使用HeapReAlloc重新分配内存,使用HeapFree分配可用内存,最后使用HeapSize函数获取先前分配的块的大小。

另一个选择当然是为malloc和朋友编写包装函数,它们存储已分配块的索引及其大小。这样,您就可以使用自己的功能来分配,重新分配,释放和测量内存块。编写这样的包装函数应该是微不足道的(虽然我不知道C,所以我不能为你做...)。

答案 4 :(得分:0)

首先,正如所有其他人所说的那样,除非你保留这些信息,否则没有便携的方法可以知道分配的大小。

重要的是标准C库的实现。大多数库只保留分配给指针的内存大小,通常大于程序请求的大小。让磁带库保持所需的大小是一个坏主意,因为这会花费额外的内存,有时我们不关心请求的大小。

严格地说,记录所请求的大小不是编译器的功能。有时似乎是因为编译器可能会重新实现标准库的一部分并覆盖系统默认值。但是,我不会使用磁带库记录请求的大小,因为我上面说的原因可能会占用更大的内存。