【问题标题】:How to get the C pointer array length? [duplicate]如何获取 C 指针数组长度? [复制]
【发布时间】:2010-09-03 15:11:19
【问题描述】:

可能重复:
length of array in function argument

有没有像 Java 这样的方法可以从 C 点数组中获取 .length?谢谢你。

【问题讨论】:

    标签: c arrays pointers programming-languages


    【解决方案1】:

    不,给定一个 C 指针,您无法以与平台无关的方式确定它的长度。

    对于实际的 C 数组,请参阅 dirkgently 的 answer

    【讨论】:

    • 问题不是很清楚;如果它的定义在范围内是本地的,您总是可以获得数组长度;-)
    • @dirkgently,我同意,目前还不清楚他们要求的是指针长度还是数组长度。我将他们重定向到您对后者的回答
    【解决方案2】:

    您可以使用宏来获取它:

    #define sizeofa(array) sizeof array / sizeof array[ 0 ]
    

    当且仅当数组是自动的并且您在其定义范围内访问它时:

    #include <stdio.h>
    int main() {
       int x[] = { 1, 2, 3 };
       printf("%zd\n", sizeofa( x ));
       return 0;
    }
    

    但是,如果您只有一个(衰减的)指针,则如果不求助于一些不可移植的实现特定的技巧,您将无法获得数组长度。

    【讨论】:

    • z 指定后面的 d、i、o、u、x 或 X 转换说明符适用于 size_t 或相应的有符号整数类型参数;或者后面的 n 转换说明符适用于指向对应于 size_t 参数的有符号整数类型的指针。
    • 那个宏需要更多的括号来避免常见的宏问题。
    • @Tyler McHenry:是的,我想我应该补充一下,但后来感觉很懒......
    • @dirk 我的 K&R2 中没有 %z
    • 来自 C99。 K&R2 很旧,正如他们所说,很多水从桥下流过。搜索名为 n1124.pdf 的文档。
    【解决方案3】:

    如果您使用 MSVC/MinGW,那么对于真正的 C 指针,有一个不可移植的解决方案:

    #include <malloc.h>
    char *s=malloc(1234);
    #ifdef __int64
    printf( "%lu\n", _msize(s));
    #else
    #endif
    

    对于像一个真正的 C 数组

    AnyType myarray[] = {...};
    

    AnyType myarray[constVal];
    

    查看其他答案。

    【讨论】:

    • 你不能假设你有一个来自 malloc 的指针。
    • @fazo,你当然可以假设它来自 malloc。这只是一个糟糕的主意:)
    猜你喜欢
    • 2013-03-24
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    相关资源
    最近更新 更多