仅使用返回的指针获取malloc的大小

时间:2012-08-26 16:42:22

标签: c arrays pointers malloc sizeof

我希望能够改变数组的大小,所以我这样创建一个:

int* array;
array = malloc(sizeof(int)*10);//10 integer elements

我可以像往常一样使用它,但是当我试图找到它的大小时:

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

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

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

我也正确地假设我在描述中说明了什么?如果我在技术上对某事有误,请纠正我。

5 个答案:

答案 0 :(得分:10)

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

完全由来记住数组的大小。

例如:

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);

答案 1 :(得分:3)

没有标准的方法来做你要求的事情。有些编译器可能会为此提供一个函数,或者其他一些分配器可能具有这样的功能,但是,正如已经说过的那样没有任何标准。

请注意,应用于数组的sizeof不起作用,因为它识别指针“来自数组”:它只是将其参数识别为数组(sizeof是少数几个上下文之一哪个数组不会衰减到指向其第一个元素的指针);一旦你的数组衰减到指针sizeof,只会产生指针的大小。

答案 2 :(得分:2)

首先,sizeof()返回“type”的大小;它不知道分配内存的事情。

其次,没有办法获得malloc()ed块的大小,除非您想深入了解编译器的运行时库的内部。这绝对不是一个好主意,特别是因为记住其他地方的大小没有问题 - 您可以在内存块前面添加另一个项目来存储大小,或者您可以单独存储它。

答案 3 :(得分:1)

在C标准和便携式中,这是不可能的。请注意,某些编译器提供非标准扩展(跟踪它,例如msize)。

此外,sizeof运算符无法告诉您块的大小,因此它产生指针的大小(请记住sizeof在编译时运行,除了可变长度数组)

所以你必须保持分配的大小,例如在数据结构中,例如:

#include <stddef.h>

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

答案 4 :(得分:1)

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

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

然后sizeof *parray会为您提供所需的答案,但您需要使用*运算符访问数组,如(*parray)[i]中所示(或者等同于parray[0][i]) 。请注意,在现代C中,10可以替换为变量。