在我写的一个函数中:
char *ab;
ab=malloc(10);
然后在另一个函数中,我想知道ab
指针所指向的内存大小。
有什么方法我可以知道ab
指向10个内存字符?
答案 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)
无法从指针本身推断出已分配内存的大小。由于ab
是char *
,sizeof(ab)
与sizeof(char *)
相同,这显然与分配的内存块的大小不同。
由于您使用所需大小调用malloc
,因此您知道大小是多少。将此数字与指向需要知道大小的函数的指针一起传递。
答案 8 :(得分:0)
我有一个结构和一个指向其内存地址的字符指针。所以将它与你的问题联系起来,我想找到它指向的内存位置的大小,即结构的大小。所以你在逻辑上做的是找到指针创建的对象的大小。这对我有用:
unsigned char * buffer= Library1Structure;
int x=sizeof(Library1Structure);
因此x的值告诉我指针缓冲区指向的内存位置的大小。