7

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

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

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

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

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

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

我假设我在描述中所说的内容是否正确?如果我在技术上对某事有错误,请纠正我。

4

5 回答 5

11

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

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

例如:

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);
于 2012-08-26T16:47:07.647 回答
3

首先,sizeof() 返回一个“类型”的大小;它对分配的内存一无所知。

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

于 2012-08-26T16:47:04.073 回答
3

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

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

于 2012-08-26T16:45:39.217 回答
3

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

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

因此,您必须保持分配的大小,例如在数据结构中,例如:

#include <stddef.h>

typedef struct {
    int   *p;
    size_t n;
} array;
于 2012-08-26T16:45:48.693 回答
1

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

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

然后sizeof *parray为您提供所需的答案,但您需要使用*运算符访问数组,如(*parray)[i](或等效地,尽管令人困惑,parray[0][i])。请注意,在现代 C 中,10可以用变量替换。

于 2012-08-26T18:42:35.503 回答