仅使用返回的指针获取malloc的大小
我希望能够改变我的数组的大小,所以我这样创建一个:
int* array; array = malloc(sizeof(int)*10);//10 integer elements
我可以像往常一样使用它像数组一样,但是当我试图找到它的大小时:
size = sizeof(array)/sizeof(int);
我得到了答案1,因为它没有将其识别为指向数组
如何获得arrays的大小? (我知道它在技术上不是一个数组,但有没有办法计算出分配的内存块的整个大小?)
我也正确地假设我在描述中说明了什么? 如果我在技术上对某事有误,请纠正我。
指针是指针,而不是数组。 它永远不会被“识别为数组”, 因为它不是数组 。
完全由你来记住数组的大小。
例如:
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);
没有标准的方法来做你要求的事情。 有些编译器可能会为此提供function,或者某些其他分配器可能具有这样的function,但是,正如已经说过的那样,没有任何标准。
请注意,应用于数组的sizeof
不起作用,因为它识别指针“来自数组”:它只是将其参数识别为数组( sizeof
是少数几个不会衰减到指向其数组的指针之一的上下文之一第一个元素); 一旦你的数组衰减到指针sizeof
只会产生指针的大小。
首先,sizeof()返回“type”的大小; 它不知道分配内存的事情。
其次,没有办法获得malloc()ed块的大小,除非你想深入了解编译器的运行时库的内部。 这绝对不是一个好主意,特别是因为记住其他地方的大小没有问题 – 您可以在内存块前面添加另一个项目来存储大小,或者您可以单独存储它。
在C标准和便携式中,这是不可能的。 请注意,某些编译器提供非标准扩展(跟踪它,例如msize
)。
此外, sizeof
运算符无法告诉您块的大小,因此它产生指针的大小(请记住sizeof
在编译时运行,除了可变长度数组)。
因此,您必须保持分配的大小,例如在数据结构中,例如:
#include typedef struct { int *p; size_t n; } array;
使用指向数组的指针类型而不是指向元素的指针类型:
int (*parray)[10] = malloc(sizeof *parray);
然后sizeof *parray
为你提供了所需的答案,但是你需要使用*
运算符来访问数组,如(*parray)[i]
(或者等同于混乱, parray[0][i]
)。 请注意,在现代C中, 10
可以用变量替换。