【发布时间】:2013-07-30 11:28:45
【问题描述】:
可以使用*(&arr+1)-arr 计算数组长度,然后简化为(&arr)[1]-arr,进一步简化为1[&arr]-arr。
但是,当在与内存分配不同的函数中计算长度时,会计算出错误的结果。
例如,
#include <iostream>
#define ARRAY_SIZE(arr) (1[&arr]-arr)
using namespace std;
void func(int *arr)
{
cout<<ARRAY_SIZE(arr)<<endl;
}
int main()
{
int arr[]={1,2,3,4,5};
cout<<ARRAY_SIZE(arr)<<endl;
func(arr);
}
这给出了输出:
5
8
是什么导致了这种奇怪的行为?
【问题讨论】:
-
如果您了解
*(&arr+1)-arr技巧的工作原理,这并不奇怪。 -
“数组不是指针”有帮助吗?
-
是您发布的实际代码的输出,还是使用
char *而不是int *的一些类似代码的输出? -
“进一步简化” ??!!
-
我真的很好奇人们在学习 C++ 时会发现这种计算数组大小的愚蠢方法。
标签: c++ arrays pointers pass-by-reference