如何在C中使用指向此数组的指针来获取数组的大小?

时间:2014-03-27 15:12:02

标签: c arrays pointers

我在C中有以下代码:

int array[5] = {0,1,2,3,4}; 

int * p = &array[0];

如何使用指针p来获取此数组p的大小指向?

5 个答案:

答案 0 :(得分:7)

对不起,这实际上是不可能的。数组的大小不会保存在任何地方。你必须自己做。

答案 1 :(得分:2)

不能仅通过指针完成。指针实际上是数组第一个元素的内存中的地址。数组大小不会自动与此指针关联。你必须自己跟踪大小。


您可以使用的一种解决方法是为数组元素保留一个特殊值,比如-1。如果您可以安排最后一个元素始终具有此值,那么您始终可以通过搜索该值来查找该数组的结尾。这就是字符串具有空终止符的原因,因此strlen()和family可以找到字符串的结尾。

答案 2 :(得分:1)

简答:在C中,无法从指针中检索数组大小。尺寸必须单独传递。

稍微简短的答案:在C中,指针只是内存中某个地点的地址。指针甚至不保证这里有一个有效的数组或变量;它只是一个内存位置的描述符。

事实上,在C中,数组“大小”的概念有点松散。可以分配一定量的连续内存,但是没有检查指针是否离开该内存。

例如:

int a[] = {1, 2, 3};
int b = a[7];

将正确编译。 C没有任何边界检查!

答案 3 :(得分:0)

使用指向它的指针无法知道数组的大小。你无法确定,因为没有办法知道数组的结尾或知道我们到达了数组的最后一个元素。

答案 4 :(得分:0)

所以,在阅读了之前的5个答案之后,这里有一个更好的答案:

a)您无法使用指针获取数组的元素数。 常见的解决方法是:

  • 使用sentinel值(参见C-String aka asciiz)
  • 单独传递长度。 (请参阅使用mem*()计算的字符串)
  • 实际上使用struct,resp。为长度值保留元素0(或-1)。 (也见计数字符串)。
  • 只需分配一大堆你知道就足够的内存,而不用考虑实际的长度。做错了很有趣也很容易。

b)您可以使用数组名称获取数组的元素数:

struct foo[my_expr];
ìnt count = sizeof array / sizeof *array;
相关问题