如何获取C指针数组的长度?

5
3个回答

6

不,无法以跨平台的方式确定C指针的长度。

但对于实际的C数组,可以参考dirkgently的答案


问题不是很清楚;如果数组的定义是局部范围,您总是可以获得数组长度;-) - dirkgently
@dirkgently,我同意,不清楚他们是在询问指针长度还是数组长度。我把他们引导到你的答案中了。 - JaredPar

3

您可以使用宏来获取它:

#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;
}

然而,如果你只有一个(已经损坏的)指针,那么你不能在不使用一些非可移植实现特定的技巧的情况下获得数组长度。


3
z表示紧接着的d、i、o、u、x或X格式说明符适用于一个size_t类型或者对应的有符号整数类型参数;或者紧接着的n格式说明符适用于指向对应于size_t类型参数的有符号整数类型的指针。 - dirkgently
2
那个宏需要更多的括号来避免常见的宏问题。 - Tyler McHenry
@Tyler McHenry:是的,我本来想加上去的,但感觉有点懒…… - dirkgently
@dirk 我的 K&R2 中没有 %z。 - user411313
1
这是来自C99的内容。K&R2已经过时了,而且很多事情都已经发生了改变。请搜索名为n1124.pdf的文档。 - dirkgently

1
如果你使用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];

请查看其他答案。


1
你不能假设从 malloc 中得到的是一个指针。 - fazo
1
@fazo,你肯定可以假设它来自malloc。只是这是一个可怕的想法 :) - JaredPar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接