函数中char指针数组的大小

使用此代码:

#include  void printSize(char *messages[]) { printf("%d", sizeof(messages) / sizeof(char *)); } int main(void) { printf("Size when through passing direct to function: "); printSize((char *[]){"Zero", "One", "Two", "Three"}); printf("\n"); printf("Size when calculating in main: %d\n", sizeof((char *[]){"Zero", "One", "Two", "Three"}) / sizeof(char *)); return 1; } 

我得到输出:

 Size when through passing direct to function: 1 Size when calculating in main: 4 

我知道没有办法在char *数组中获得正确数量的元素,但我很好奇他们为什么会给出不同的结果。

当您使用数组作为函数的参数时,它“衰减”到指向数组的第一个元素的指针。 由于messages是指向char的指针数组,因此当数组传递给函数时,它将成为指向char的指针。 即使您在参数列表中将其指定为数组,也会发生这种情况; 这就是语言的运作方式。

因此在void printSize() ,当您使用sizeof(messages) ,您将获得指针的大小。 您将其除以另一个指针sizeof (char*)的大小。 在您的系统上,两种情况下指针的大小都是4个字节,因此得到的结果是4/4,即1。

但是,在main()中,您的char*数组被定义为数组,并将其视为数组。 当sizeof()运算符应用于数组时,您将获得整个数组中所有字节的大小。 这是一个什么样的? 这是一个四个指向char指针数组。 每个指针的大小为4.因此,数组的总大小为4 * 4 = 16个字节。 你将这个16除以一个指向char的指针的大小,即4,所以你得到结果16/4,即4作为main()的答案。

  1. 这是因为char *messages[]只是char **messages语法糖,所以你只是获得指针的大小,而不是整个数组的大小。

  2. 如果不将大小作为另一个参数传递,则不能。

您应该查看关于arrays和指针的comp.lang.c FAQ部分。