不,没有办法获得这些信息,而不依赖于malloc的实现细节。特别地,malloc可以分配比您请求更多的字节(例如,用于特定存储器架构中的效率)。这将是更好地重新设计你的代码,以便你跟踪n明确。另一种方法是至少同样多的重新设计和一个更危险的方法(因为它是非标准的,滥用指针的语义,并将是一个维护噩梦为那些后来你):存储的长度在malloc’d地址,后跟数组。分配将是:
void *p = calloc(sizeof(struct mystruct) * n + sizeof(unsigned long int),1));
*((unsigned long int*)p) = n;
n现在存储在*((unsigned long int *)p),现在数组的开始
void *arr = p+sizeof(unsigned long int);
编辑:只是为了玩魔鬼的倡导者…我知道这些“解决方案”都需要重新设计,但让我们玩。
当然,上面提出的解决方案只是一个(包装好的)结构的hacky实现。你也可以定义:
typedef struct {
unsigned int n;
void *arr;
} arrInfo;
并传递arrInfos而不是原始指针。
现在我们在做饭。但是只要你重新设计,为什么要停在这里?你真正想要的是一个抽象数据类型(ADT)。对于算法和数据结构类的任何介绍性文本都可以。 ADT定义数据类型的公共接口,但隐藏该数据类型的实现。因此,公开的数组的ADT可能看起来像
typedef void* arrayInfo;
(arrayInfo)newArrayInfo(unsignd int n, unsigned int itemSize);
(void)deleteArrayInfo(arrayInfo);
(unsigned int)arrayLength(arrayInfo);
(void*)arrayPtr(arrayInfo);
...
换句话说,ADT是一种数据和行为封装的形式…换句话说,它就像你可以使用直线C.使用面向对象的编程。除非你被困在一个平台上有一个C编译器,你可以去整个猪,只使用STL std :: vector。
在那里,我们采取了一个关于C的简单问题,最后在C。上帝帮助我们所有人。