不,如果不强烈依赖malloc
的实现细节,就无法获得这些信息.特别是,malloc
可能会分配比您请求的更多字节(例如,为了特定内存体系 struct 的效率).最好是重新设计代码,以便明确地跟踪代码.另一种方法是进行同样多的重新设计,并采用更危险的方法(考虑到它是非标准的,滥用了指针的语义,对后面的人来说将是维护的噩梦):将长度n
存储在malloc的地址,然后是array.分配将是:
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);
Edit:美元只是为了扮演魔鬼的代言人.我知道这些"解决方案"都需要重新设计,但让我们来玩一玩吧.
当然,上面给出的解决方案只是一个(包装良好的) struct 的简陋实现.你不妨定义一下:
typedef struct {
unsigned int n;
void *arr;
} arrInfo;
并传递大约arrInfo
个指针,而不是原始指针.
现在我们在做饭.但只要你在重新设计,为什么就到此为止?您真正想要的是抽象数据类型(ADT).算法和数据 struct 类的任何介绍性文本都可以.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++为结尾.愿god 帮助我们所有人.