c语言 - 数组它不打印其大小内部功能



它打印了 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:在函数 'printValues' 中: teste.c:29:32: 警告: 数组函数参数 'hotelData' 上的 'sizeof' 将返回 'char' 的大小 (*)[3][50]' [-Wsizeof-array-argument]  int arraySize = sizeof (hotelData)/sizeof (hotelData[0]); ^ Teste.c:27:27:注意:在这里声明  void printValues(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的操作数、一元&的操作数或用于初始化数组的字符串文字。

最新更新