c语言指针读取数组长度,如何从C中的指针获取数组的大小?

不,没有办法获得这些信息,而不依赖于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。上帝帮助我们所有人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值