使用此代码:
#include <stdio.h>
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 *数组中获得正确数量的元素,但我很好奇它们为什么会给出不同的结果。
答案 0 :(得分:4)
这是因为char *messages[]
只是char **messages
的语法糖,所以你只是获得指针的大小,而不是整个数组的大小。
如果不将大小作为另一个参数传递,则不能。
您应该查看Arrays & Pointers上的comp.lang.c常见问题解答部分。
答案 1 :(得分:2)
当您使用数组作为函数的参数时,它会“衰减”到指向数组第一个元素的指针。由于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()
中的答案。