猿问

如何找到'sizeof'(指向数组的指针)?

如何找到'sizeof'(指向数组的指针)?

首先,这里是一些代码:

int main() {
    int days[] = {1,2,3,4,5};
    int *ptr = days;
    printf("%u\n", sizeof(days));
    printf("%u\n", sizeof(ptr));

    return 0;}

有没有办法找出ptr指向的数组的大小(而不是仅仅给出它的大小,在32位系统上是4个字节)?


HUWWW
浏览 1272回答 5
5回答

茅侃侃

不,你不能。编译器不知道指针指向的是什么。有一些技巧,比如以已知的带外值结束数组,然后计算大小直到该值,但这不是使用sizeof。另一个技巧是Zan提到的那个,就是把它放在某个地方。例如,如果您正在动态分配数组,请分配一个大于您需要的块的块,在第一个int中存储大小,并返回ptr + 1作为指向数组的指针。当您需要大小时,递减指针并查看隐藏值。只记得从头开始释放整个块,而不仅仅是数组。

aluckdog

答案是不。”C程序员做的是在某处存储数组的大小。它可以是结构的一部分,或者程序员可以欺骗一点和malloc()更多的内存而不是请求,以便在数组开始之前存储长度值。

米脂

对于动态数组(malloc或C ++ new),您需要存储其他人提到的数组大小,或者可能构建一个处理添加,删除,计数等的数组管理器结构。不幸的是,C不能做到这一点。 C ++,因为你基本上必须为你正在存储的每种不同的数组类型构建它,如果你需要管理多种类型的数组,这很麻烦。对于静态数组,例如示例中的静态数组,有一个用于获取大小的公共宏,但不建议这样做,因为它不检查参数是否真的是静态数组。宏虽然在实际代码中使用,例如在Linux内核头文件中,尽管它可能与下面的稍有不同:#if !defined(ARRAY_SIZE)     #define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))#endifint main(){     int days[] = {1,2,3,4,5};     int *ptr = days;     printf("%u\n", ARRAY_SIZE(days));     printf("%u\n", sizeof(ptr));     return 0;}你可以google出于对这类宏的警惕。小心。如果可能的话,C ++ stdlib如vector,它更安全,更易于使用。

BIG阳

有一个使用C ++模板的干净解决方案,不使用sizeof()。以下getSize()函数返回任何静态数组的大小:#include&nbsp;<cstddef>template<typename&nbsp;T,&nbsp;size_t&nbsp;SIZE>size_t&nbsp;getSize(T&nbsp;(&)[SIZE])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SIZE;}这是一个foo_t结构的示例:#include&nbsp;<cstddef>template<typename&nbsp;T,&nbsp;size_t&nbsp;SIZE>size_t&nbsp;getSize(T&nbsp;(&)[SIZE])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SIZE;}struct&nbsp;foo_t&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ball;};int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;foo_t&nbsp;foos3[]&nbsp;=&nbsp;{{1},{2},{3}}; &nbsp;&nbsp;&nbsp;&nbsp;foo_t&nbsp;foos5[]&nbsp;=&nbsp;{{1},{2},{3},{4},{5}}; &nbsp;&nbsp;&nbsp;&nbsp;printf("%u\n",&nbsp;getSize(foos3)); &nbsp;&nbsp;&nbsp;&nbsp;printf("%u\n",&nbsp;getSize(foos5)); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}输出:3 5

尚方宝剑之说

对于这个具体的例子,是的,如果你使用typedef(见下文)。当然,如果你这样做,你也可以使用SIZEOF_DAYS,因为你知道指针指向的是什么。如果你有一个(void *)指针,就像malloc()等返回的那样,那么,不,没有办法确定指针所指向的数据结构,因此无法确定其大小。#include&nbsp;<stdio.h>#define&nbsp;NUM_DAYS&nbsp;5typedef&nbsp;int&nbsp;days_t[&nbsp;NUM_DAYS&nbsp;];#define&nbsp;SIZEOF_DAYS&nbsp;(&nbsp;sizeof(&nbsp;days_t&nbsp;)&nbsp;)int&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;days_t&nbsp;&nbsp;days; &nbsp;&nbsp;&nbsp;&nbsp;days_t&nbsp;*ptr&nbsp;=&nbsp;&days;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"SIZEOF_DAYS:&nbsp;&nbsp;%u\n",&nbsp;SIZEOF_DAYS&nbsp;&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"sizeof(days):&nbsp;%u\n",&nbsp;sizeof(days)&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"sizeof(*ptr):&nbsp;%u\n",&nbsp;sizeof(*ptr)&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"sizeof(ptr):&nbsp;&nbsp;%u\n",&nbsp;sizeof(ptr)&nbsp;&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}输出:SIZEOF_DAYS:&nbsp;&nbsp; 20sizeof(days): &nbsp;20sizeof(*ptr): &nbsp;&nbsp;20sizeof(ptr):&nbsp;&nbsp; &nbsp;&nbsp;4
随时随地看视频慕课网APP
我要回答