【问题标题】:Array its not printing its size inside function [duplicate]数组它没有在函数内部打印它的大小[重复]
【发布时间】:2021-05-23 02:10:55
【问题描述】:

它打印的是 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)

【问题讨论】:

标签: arrays c function


【解决方案1】:

当数组作为参数传递给函数时,它会自动转换为指向其第一个元素的指针。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 的操作数,是一元& 的操作数或者是用于初始化数组的字符串字面量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2021-10-01
    • 2017-04-29
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多