gpt4 book ai didi

c - 如何从 C 中的指针获取数组的大小?

转载 作者:行者123 更新时间:2023-11-30 17:21:03 26 4
gpt4 key购买 nike

我已经分配了一个 mystruct 的“数组”,大小为 n,如下所示:

if (NULL == (p = calloc(sizeof(struct mystruct) * n,1))) {
/* handle error */
}

后来,我只能访问p,而不再访问n。有没有办法确定只给定指针p的数组的长度?

我认为它一定是可能的,因为free(p)就是这样做的。我知道 malloc() 会跟踪它分配了多少内存,这就是它知道长度的原因;也许有办法查询这些信息?类似...

int length = askMallocLibraryHowMuchMemoryWasAlloced(p) / sizeof(mystruct)

我知道我应该重新编写代码以便我知道n,但如果可能的话我宁愿不这样做。有什么想法吗?

最佳答案

不,如果不强烈依赖 malloc 的实现细节,就无法获取此信息。特别是,malloc 可能会分配比您请求的更多的字节(例如,为了提高特定内存架构的效率)。最好重新设计您的代码,以便您明确地跟踪 n 。另一种选择是至少同样多的重新设计和更危险的方法(鉴于它是非标准的,滥用指针的语义,并且对于那些追随你的人来说将是维护噩梦): malloc 地址处的长度n,后跟数组。那么分配将是:

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;

并传递 arrInfo 而不是原始指针。

现在我们正在做饭。但只要你正在重新设计,为什么要停在这里呢?您真正想要的是抽象数据类型(ADT)。任何算法和数据结构类的介绍性文本都可以做到这一点。 ADT 定义了数据类型的公共(public)接口(interface),但隐藏了该数据类型的实现。因此,公开数组的 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++。愿上帝帮助我们所有人。

关于c - 如何从 C 中的指针获取数组的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28392506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com