如何计算指针指向内存的大小?

时间:2011-07-26 11:07:15

标签: c memory-management

在我写的一个函数中:

char *ab; 

ab=malloc(10);

然后在另一个函数中,我想知道ab指针所指向的内存大小。 有什么方法我可以知道ab指向10个内存字符?

9 个答案:

答案 0 :(得分:7)

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

即。而不是

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

使用

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

并在您的代码中

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

答案 1 :(得分:3)

这是一个秘密,只有free()才知道。它可能在您的系统中,但完全依赖于实现方式。

有点尴尬,但如果你想把所有东西放在一起:

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 ,以使代码成为更通用的模板。

答案 2 :(得分:2)

你不能(无论如何)。你必须自己跟踪大小。

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

答案 3 :(得分:1)

不,不幸的是。

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

没有

现在,正如所说,有非便携式黑客可以做到这一点,但依靠它们是不安全的。

如果您100%确定内存是通过malloc()分配的,那么您可以将指针倒回几个字节并检查用于跟踪已分配内存部分的'malloc节点'哪些没有。但是,我不能强调这一点 - 不要依赖于此。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

由于您使用所需大小调用malloc,因此您知道大小是多少。将此数字与指向需要知道大小的函数的指针一起传递。

答案 8 :(得分:0)

我有一个结构和一个指向其内存地址的字符指针。所以将它与你的问题联系起来,我想找到它指向的内存位置的大小,即结构的大小。所以你在逻辑上做的是找到指针创建的对象的大小。这对我有用:

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

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