在一个功能我已经写:如何计算指针指向内存的大小?
char *ab;
ab=malloc(10);
然后在另一个功能,我想知道的内存由ab
指针指向大小。 有没有什么办法可以知道ab
指向10个字符的内存?
在一个功能我已经写:如何计算指针指向内存的大小?
char *ab;
ab=malloc(10);
然后在另一个功能,我想知道的内存由ab
指针指向大小。 有没有什么办法可以知道ab
指向10个字符的内存?
这是一个深奥的秘密,只有免费()知道肯定。它可能在你的系统中,但是完全依赖于实现。
有点别扭,但如果你想保留一切融合在一起:
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使代码更通用的模板。
大小是你传入malloc
的大小,你可以使用全局变量或宏来记住它。
不,不幸的是。
您需要将块的大小与指针一起传递。
有没有办法,你必须将分配的内存的大小存储在另一个变量。
你不能(可移植地反正)。你必须自己跟踪尺寸。
malloc
的某些实现可能会为您提供访问该信息的API,但标准中没有关于此的规定。
不,你没有一个标准的方法来做到这一点。您必须将指针内存的大小与指针一起传递,这是一个常见的解决方案。
I.e.的
void f(char* x)
{
//...
}
使用
void f(char *x, size_t length)
{
//....
}
,而不是在你的代码
char *ab = malloc(10);
f(ab, 10);
我会建议函数原型为void f(char * x,size_t length)'。 'size_t'更好地表示了被传递的值的类型,并且还与'malloc'参数的类型匹配。 –
有没有办法从指针本身推断分配内存的大小。由于ab
是char *
,sizeof(ab)
与sizeof(char *)
相同,这显然不同于分配的内存块的大小。
既然你用所需的尺寸调用malloc
,你就知道尺寸是多少。将此编号与指向需要知道尺寸的函数的指针一起传递。
号
现在,他这样说,也有不可移植的黑客要做到这一点,但它不是安全的依靠他们。
如果您完全知道内存是通过malloc()分配的,那么您可以将指针倒回几个字节,然后检查用于跟踪内存哪些部分的'malloc节点'分配,哪些没有。但是,我无法强调这一点 - 不要依赖于此。
我有一个结构和一个char指针指向它的内存地址。因此,将它与您的问题相关联,我想找到它指向的内存位置的大小,即结构的大小。因此,逻辑上你所做的是找到指针创建的对象的大小。这对我有效:
unsigned char * buffer= Library1Structure;
int x=sizeof(Library1Structure);
所以x的值告诉我指针缓冲区指向的内存位置的大小。
我需要知道在不同功能的尖端内存的大小,我无法访问“Library1Structure” –
在头文件中声明library1structure然后... –
即使免费()也不一定知道。 malloc(10)实际上可以分配16个字节; free()只需要知道实际分配的16个字节,而不需要10个字节。 –
是的......我认为这是“特定实施”的一部分。 – Gilbert