请考虑C中的以下代码:
int size = sizeof(a)/sizeof(a[0])
a
属于char **
类型,其对我的代码的目的是作为一个数组。保证a
具有多个元素。不知何故,size
总是获得值1.
我最初的猜测是a
中的sizeof(a)
被视为第一个指针而不是数组。我该如何解决这个问题?
答案 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的指针)的大小;可能8
。 sizeof(a[0])
是指针(对于char)的大小 - 仍为8
,因为指针大小是指针大小,无论它们指向什么。没有办法提升指向数组的指针(虽然很容易向另一个方向移动并为指针指定一个数组)。