无法确定指针数组的大小

时间:2016-12-01 04:29:49

标签: c arrays pointers multidimensional-array

请考虑C中的以下代码:

int size = sizeof(a)/sizeof(a[0])

a属于char **类型,其对我的代码的目的是作为一个数组。保证a具有多个元素。不知何故,size总是获得值1.

我最初的猜测是a中的sizeof(a)被视为第一个指针而不是数组。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

从指针开始,您无法知道它指向的缓冲区/数组的大小。您必须自己始终跟踪/传递数组的大小。

您尝试使用的技巧仅适用于数组(降级为指针)。不幸的是,它可能会意外地应用于指针。这就是Linux内核定义以下宏的原因:

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))

http://lxr.free-electrons.com/source/include/linux/kernel.h#L53

__must_be_array()调用一些特定于编译器的功能,以确保您刚刚犯的错误导致编译错误,而不是错误的值。

答案 1 :(得分:0)

你没有。只有数组(用方括号声明的变量,如char x[80])才能正确执行此操作。无法确定指针(带有星号声明的变量,如char *y)指向的区域大小。如果要将数组传递给函数,则该函数必须已知道大小,或者需要使用指针传递大小。

所以你的例子中发生的事情是:sizeof(a)是CPU架构中指针(指向char的指针)的大小;可能8sizeof(a[0])是指针(对于char)的大小 - 仍为8,因为指针大小是指针大小,无论它们指向什么。没有办法提升指向数组的指针(虽然很容易向另一个方向移动并为指针指定一个数组)。