2011-07-26 52 views

回答

3

这是一个深奥的秘密,只有免费()知道肯定。它可能在你的系统中,但是完全依赖于实现。

有点别扭,但如果你想保留一切融合在一起:

typedef struct 
{ // size of data followed by data (C only trick! NOT for C++) 
    int  dimension; // number of data elements 
    int  data[1];  // variable number of data elements 
} malloc_int_t; 

malloc_int_t *ab; 

int dimension = 10; 
ab = malloc(sizeof(*ab) + (dimension-1)*sizeof(int)); 
ab->dimension = dimension; 

ab->data[n] // data access

我已经改变了数据类型INT使代码更通用的模板。

+0

即使免费()也不一定知道。 malloc(10)实际上可以分配16个字节; free()只需要知道实际分配的16个字节,而不需要10个字节。 –

+0

是的......我认为这是“特定实施”的一部分。 – Gilbert

0

大小是你传入malloc的大小,你可以使用全局变量或宏来记住它。

1

不,不幸的是。

您需要将块的大小与指针一起传递。

1

有没有办法,你必须将分配的内存的大小存储在另一个变量。

2

你不能(可移植地反正)。你必须自己跟踪尺寸。

malloc的某些实现可能会为您提供访问该信息的API,但标准中没有关于此的规定。

7

不,你没有一个标准的方法来做到这一点。您必须将指针内存的大小与指针一起传递,这是一个常见的解决方案。

I.e.的

void f(char* x) 
{ 
    //... 
} 

使用

void f(char *x, size_t length) 
{ 
    //.... 
} 

,而不是在你的代码

char *ab = malloc(10); 
f(ab, 10); 
+4

我会建议函数原型为void f(char * x,size_t length)'。 'size_t'更好地表示了被传递的值的类型,并且还与'malloc'参数的类型匹配。 –

0

有没有办法从指针本身推断分配内存的大小。由于abchar *,sizeof(ab)sizeof(char *)相同,这显然不同于分配的内存块的大小。

既然你用所需的尺寸调用malloc,你就知道尺寸是多少。将此编号与指向需要知道尺寸的函数的指针一起传递。

1

现在,他这样说,也有不可移植的黑客要做到这一点,但它不是安全的依靠他们。

如果您完全知道内存是通过malloc()分配的,那么您可以将指针倒回几个字节,然后检查用于跟踪内存哪些部分的'malloc节点'分配,哪些没有。但是,我无法强调这一点 - 不要依赖于此。

0

我有一个结构和一个char指针指向它的内存地址。因此,将它与您的问题相关联,我想找到它指向的内存位置的大小,即结构的大小。因此,逻辑上你所做的是找到指针创建的对象的大小。这对我有效:

unsigned char * buffer= Library1Structure; 
int x=sizeof(Library1Structure); 

所以x的值告诉我指针缓冲区指向的内存位置的大小。

+0

我需要知道在不同功能的尖端内存的大小,我无法访问“Library1Structure” –

+0

在头文件中声明library1structure然后... –