Arrays 数组未在函数内打印其大小
它正在打印0,但我希望是1。数组中第一个维度的大小被省略,因为我想用相同的方法传递多个数组条目,如何为迭代获取这些条目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
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个数组的数组50char
”(也称为char(*)[3][50]
),因此它指向3个数组的数组50char
,其大小为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个数组的数组50char
”(也称为char(*)[3][50]
),因此它指向3个数组的数组50char
,其大小为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
的操作数,是一元&
的操作数,或者是用于初始化数组的字符串文字。我不知道您想要什么,但是数组。,,我不知道您想要什么,但是一个数组,,