用返回的指针获取malloc分配的内存大小

8
我希望能够改变我的数组大小,因此我这样创建了一个数组:
int* array;
array = malloc(sizeof(int)*10);//10 integer elements

我可以像通常一样使用这个变量作为数组,但是当我尝试像这样查找它的大小时:

size = sizeof(array)/sizeof(int);

我得到了答案1,因为它没有将其识别为指向数组的指针。

如何获取数组的大小? (我知道它不是技术上的数组,但有没有办法计算分配的整个内存块的大小?)

另外,我在描述中所述的是否正确?如果我在技术上有错误,请纠正我。


你做不到。sizeof 不知道 malloc - cnicutar
6个回答

13

指针是一个指针,而不是数组。它永远不会被“识别为数组”,因为它不是一个数组。

记住数组的大小完全取决于

例如:

struct i_must_remember_the_size
{
    size_t len;
    int * arr;
};

struct i_must_remember_the_size a = { 10, NULL };
a.arr = malloc(a.len * sizeof *a.arr);

4
如果使用malloc分配内存时实际大小未知,那么free(arr)如何知道要释放多少内存? - Zulakis
@Zulakis: free只是通知系统分配器,与指针值对应的分配已被释放。由系统分配器的实现来保留足够的簿记信息以理解该请求。例如,如果分配器为不同大小维护竞技场,则指针值本身可以指示它来自哪个竞技场。 - Kerrek SB

5
在C标准和可移植性方面不可能实现。请注意,有些编译器提供非标准的扩展(例如msize)。此外,sizeof运算符无法告知块的大小,因此它将产生指针的大小(请记住,sizeof在编译时操作,除非使用变长数组)。因此,您必须保留已分配的大小,例如在数据结构中:
#include <stddef.h>

typedef struct {
    int   *p;
    size_t n;
} array;

3
没有标准的方法来完成你的请求。一些编译器可能会提供这样的函数,或者其他的分配器可能会有这样的函数,但是如前所述,没有任何标准。
需要注意的是,对数组应用sizeof并不起作用,因为它将指针“作为来自数组的”指针:它仅将其参数识别为数组(sizeof是少数几个上下文之一,在其中数组不会退化为指向其第一个元素的指针);一旦数组退化为指针,sizeof将只返回指针的大小。

3

首先,sizeof()返回的是一个“类型”的大小;它并不知道已经分配的内存。

其次,除非您想深入了解编译器运行时库的内部,否则无法获取malloc()分配的块的大小。这绝对不是一个好主意,特别是因为在其他地方记住大小没有问题--您可以将内存块前缀与另一个项目一起存储以存储大小,或者可以单独存储大小。


2

使用指向数组的指针类型而不是指向元素的指针类型:

int (*parray)[10] = malloc(sizeof *parray);

然后,sizeof *parray 可以给你想要的答案,但是你需要使用 * 运算符来访问数组,例如 (*parray)[i](或等效但令人困惑的 parray[0][i])。请注意,在现代 C 中,10 可以被替换为一个变量。

“现代C”-具体来说,C99(和C11)支持VLA。 - mk12

1
你所需要的是malloc_usable_size(void *ptr),这是GNU扩展。
问题在于,你可能会分配像七这样的字节数,但malloc分配器将返回从malloc竞技场中第一个更大的二进制兄弟。函数malloc_usable_size据说返回实际分配块的大小,而不是从malloc()请求的大小。
来自: man page
SYNOPSIS

       #include <malloc.h>

       size_t malloc_usable_size(void *ptr);

DESCRIPTION

       The malloc_usable_size() function returns the number of usable
       bytes in the block pointed to by ptr, a pointer to a block of
       memory allocated by malloc(3) or a related function.

NOTES

   The value returned by malloc_usable_size() may be greater than
   the requested size of the allocation because of alignment and
   minimum size constraints.  Although the excess bytes can be
   overwritten by the application without ill effects, this is not
   good programming practice: the number of excess bytes in an
   allocation depends on the underlying implementation.

   The main use of this function is for debugging and introspection.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接