Arrays 数组未在函数内打印其大小

Arrays 数组未在函数内打印其大小,arrays,c,function,Arrays,C,Function,它正在打印0,但我希望是1。数组中第一个维度的大小被省略,因为我想用相同的方法传递多个数组条目,如何为迭代获取这些条目 void printValues(char hotelData[][3][50], int n); char hotelData [1][3][50] = { "unidadeid1Fk", "john fernandes", "executiveRoom" }; int main( v

它正在打印0,但我希望是1。数组中第一个维度的大小被省略,因为我想用相同的方法传递多个数组条目,如何为迭代获取这些条目

void printValues(char hotelData[][3][50], int n);

char hotelData [1][3][50] = 

    {
    "unidadeid1Fk", "john fernandes", "executiveRoom"
    };

int main( void )
{
    printValues(hotelData, 0);    
}

void printValues(char hotelData[][3][50], int n)
{        
    int arraySize = sizeof (hotelData) / sizeof (hotelData[0]);
    printf("ArraySize: %i ", arraySize);
}
输出为

 ArraySize: 0
这段代码返回了这个警告,我不知道这是什么意思,也不知道如何解决它:

teste.c: In function 'printValues': teste.c:29:32: warning: 'sizeof' on array function parameter 'hotelData' will return size of 'char (*)[3][50]' [-Wsizeof-array-argument] int arraySize = sizeof (hotelData) / sizeof (hotelData[0]); ^ teste.c:27:27: note: declared here void printValues(char hotelData[][3][50], int n) teste.c:在函数“printValues”中:teste.c:29:32:警告:数组函数参数“hotelData”上的“sizeof”将返回“char”大小 (*)[3][50]'[-Wsizeof数组参数] int arraySize=sizeof(hotelData)/sizeof(hotelData[0]); ^测试c:27:27:注:此处声明 无效打印值(char hotelData[][3][50],int n)
当数组作为参数传递给函数时,它会自动转换为指向其第一个元素的指针。1类似地,当函数的参数声明是数组时,它会自动调整为指针

当传递指向数组第一个元素的指针时,不会自动传递任何大小信息。如果在函数内部,希望知道数组的大小,则必须将其作为参数传递,或者使其可用于函数

相反,编译器知道
hotelData[0]
的大小,因为它知道
hotelData[0]
的完整类型。虽然
hotelData
已转换为指针,但它是一个类型为“指针指向3个数组的数组50
char
”(也称为
char(*)[3][50]
),因此它指向3个数组的数组50
char
,其大小为3•50•1=150

指针
hotelData
的大小可能是4或8个字节。在任何情况下,它肯定小于150字节,因此将其除以150得到0(在整数算术中)

通常,编译器只知道完整类型声明可见的对象的大小。即使忽略参数声明
char hotelData[][3][50]
自动调整为
char(*hotelData)[3][50]
,由于
[]
为空,
hotelData[][3][50]
的完整类型此时在源代码中不可见。C不会将任何关于对象大小的额外信息与函数参数一起传递;必须从参数声明中完全了解类型信息。(尽管您和我可以在上面的
main
例程中看到对
printValues
的调用,但编译器无法将应用程序中名为
hotelData
的外部对象的信息用于名为
hotelData
的参数;尽管名称相同,但它们是不同的东西。)

脚注
1每当在表达式中使用数组时,它都会自动转换为指向其第一个元素的指针,除非它是
sizeof
的操作数、一元
&
的操作数或用于初始化数组的字符串文字。

当数组作为参数传递给函数时,它会自动转换为指向其第一个元素的指针。1类似地,当函数的参数声明是数组时,它会自动调整为指针

当传递指向数组第一个元素的指针时,不会自动传递任何大小信息。如果在函数内部,希望知道数组的大小,则必须将其作为参数传递,或者使其可用于函数

相反,编译器知道
hotelData[0]
的大小,因为它知道
hotelData[0]
的完整类型。虽然
hotelData
已转换为指针,但它是一个类型为“指针指向3个数组的数组50
char
”(也称为
char(*)[3][50]
),因此它指向3个数组的数组50
char
,其大小为3•50•1=150

指针
hotelData
的大小可能是4或8个字节。在任何情况下,它肯定小于150字节,因此将其除以150得到0(在整数算术中)

通常,编译器只知道完整类型声明可见的对象的大小。即使忽略参数声明
char hotelData[][3][50]
自动调整为
char(*hotelData)[3][50]
,由于
[]
为空,
hotelData[][3][50]
的完整类型此时在源代码中不可见。C不会将任何关于对象大小的额外信息与函数参数一起传递;必须从参数声明中完全了解类型信息。(尽管您和我可以在上面的
main
例程中看到对
printValues
的调用,但编译器无法将应用程序中名为
hotelData
的外部对象的信息用于名为
hotelData
的参数;尽管名称相同,但它们是不同的东西。)

脚注
1每当在表达式中使用数组时,它都会自动转换为指向其第一个元素的指针,除非它是
sizeof
的操作数,是一元
&
的操作数,或者是用于初始化数组的字符串文字。

我不知道您想要什么,但是数组。,,我不知道您想要什么,但是一个数组,,