C 相同的表达式,但在函数中使用时返回值不同
我正在编写一个返回ints数组大小的函数。逻辑是:C 相同的表达式,但在函数中使用时返回值不同,c,arrays,C,Arrays,我正在编写一个返回ints数组大小的函数。逻辑是:sizeof(arr)/sizeof(int)如果我将其保存到变量中,效果很好,但是如果我将其返回到函数中,对于大小为10字节的数组,我会得到1。为什么?这是我的密码: int b[10]; int t1= sizeof (b) / sizeof (int); size_t t2 = lenof(b); printf("t1 = %d, t2 = %d\n", t1, t2); size_t lenof (int arr[]) { retur
sizeof(arr)/sizeof(int)
如果我将其保存到变量中,效果很好,但是如果我将其返回到函数中,对于大小为10字节的数组,我会得到1
。为什么?这是我的密码:
int b[10];
int t1= sizeof (b) / sizeof (int);
size_t t2 = lenof(b);
printf("t1 = %d, t2 = %d\n", t1, t2);
size_t lenof (int arr[]) { return sizeof (arr) / sizeof (int); }
上面的C代码打印:
t1 = 10, t2 = 1
有人能给我解释一下吗?也许我应该用指针来做?谢谢。场景1:
int t1= sizeof (b) / sizeof (int);
在这种情况下,sizeof(b)
返回数组的大小,该大小除以int
的大小可以正确地生成数组元素的数量
场景2:将数组传递给函数时,它会作为指向数组中第一个元素的指针衰减。因此
lenof(int arr[])
实际上相当于:
lenof(int *arr)
鉴于此,sizeof(arr)
生成系统上指针的大小&该大小似乎与系统上int
的大小相同,因此除法和函数返回1
C不提供数组的边界检查,因此,如果您编写的内容超出数组边界,将永远不会收到警告。这本质上意味着当使用数组时,您必须自己跟踪数组中存在多少元素 如果需要函数中数组的大小,最简单的解决方案是将数组的大小作为单独的参数传递
lenof(int arr[], int len);
你应该使用指针。作为一个参数,'int ATT[]是真的int,大小与sieof(int)相同。我认为
c++-Faq
或c++lounge Faq
的理想人选。