内存块的大小通常存储在指针下方。虽然这是一个黑客(你说我能...),下面的代码在我的Linux机器上运行:
#include <stdio.h>
#include <stdlib.h>
int main(){
int *p, n=123;
p = (int*)malloc(n*sizeof(int));
printf("allocated %d bytes for p\n", n*sizeof(int));
printf("p[-2] : %d \n", *(p-2));
printf("malloc_useable_size(p) : %d\n", malloc_usable_size(p));
free(p);
}
它产生的输出是这样的:
allocated 492 bytes to p
p[-2] : 513
malloc_useable_size(p): 504
注意,大小p [-2]并不完全是492
- 由于内务管理和边界对齐等原因,还有一些额外的空间用完了。
另请注意 - 这与编译器gcc
一起工作;但g++
抱怨指针转换,并且我没有宣布malloc_useable_size()
。在看到@ fanl的回答后,我出于好奇而添加了该行。在看到@OliCharlesworth的回答后,我还玩了一下mallinfo
的输出。
您可以更改n的值,并且您会看到事物非常吻合 - 例如,如果您将n(在上面的代码中)从100增加到119,那么感兴趣的不同变量的值为如下:
n | p[-2] | usable | uordblks
----+-------+--------+---------
100 417 408 416
101 417 408 416
102 417 408 416
103 433 424 432
104 433 424 432
105 433 424 432
106 433 424 432
107 449 440 448
108 449 440 448
109 449 440 448
110 449 440 448
111 465 456 464
112 465 456 464
113 465 456 464
114 465 456 464
115 481 472 480
116 481 472 480
117 481 472 480
118 481 472 480
119 497 488 496
总会有9 usable
和p[-2]
1
之间p[-2]
和uordblks
之间,以及不同。 p[-2]
方法的优点在于它可以准确地告诉你你的询问 - 这个指针的大小。其他通话可能实际上告诉你什么你真想 ...
PS这很可能是对的内存非常大的块,你需要看的是住在*((long int*)(p)-1)
的long integer
。这给了我灵感的一个不错的宏:
#define PSIZE(a) (*((long int*)(a)-1))
然后你可以找到任何指针的大小与
printf("my pointer size is %ld\n", PSIZE(myPointer));
而不必担心指针的类型。我确认这适用于不同类型的指针,对于块> 4G。显然,您可以决定在宏中减1,以便数字与mallinfo()完全一致。
编辑:指针下方存储的内容的更完整描述在this earlier question的答案之一中给出。这表明我观察到的“+1”实际上是由于存储在LSB中的标志。正确的方法是用〜3结果,清除两个LSB,然后从结果中减去(long int *)的大小(实际上原来的答案减去2 * sizeof(unsigned long int),但我认为这是错):
#define PSIZE(a) ((*((long int*)(a)-1))&~3 - sizeof(long int*))
链接的答案强烈建议只用这个调试,而不是依赖于它的实际代码。我感到不得不重复这个警告。
可能重复[是否有可能找到分配给指针的内存,而不搜索malloc语句](http://stackoverflow.com/questions/5813078/is-it-possible-to-find-the -memory-allocated-to-the-pointer-without-searching-fo) – Floris 2013-03-13 13:19:47
问题是类似的,但不完全相同。那个人打算用它来计算一个数组在代码本身中有多久,这个答案中建议避免使用这个数组。在这种情况下,这个问题只是为了跟踪总内存。 – 2013-03-13 16:21:46
也许 - 但接受的答案在两种情况下都是一样的......“使用malloc_usable_size()”。这使得它至少在我心中是一个“可能的重复”。通过创建链接,我们为遇到一个问题的人提供了看到更多可能答案的机会。 – Floris 2013-03-13 16:32:56