c++ - 使用指针的数组长度

标签 c++ arrays pointers pass-by-reference

<分区>

可以使用 *(&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

是什么导致了这种奇怪的行为?

最佳答案

Array length can be calculated using *(&arr+1)-arr

仅当 arr 实际上是一个数组时。在 func 中,arr 是一个指针,因此它取消引用内存中的一个随机字以给出未定义的行为。

仅给定指向其第一个元素的指针,无法判断数组的大小。您可以通过引用传递数组:

template <size_t N>
void func(int (&arr)[N]) {
    cout<<ARRAY_SIZE(arr)<<endl;
    cout<<N<<endl;               // equivalent, and less weird
}

使用相同的技术,我们可以重新实现 ARRAY_SIZE,而无需求助于预处理器或任何奇怪的指针算法:

template <size_t N>
size_t ARRAY_SIZE(int (&arr)[N]) {
    return N;
}

关于c++ - 使用指针的数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17945816/

相关文章:

C语言——矩阵乘法bug

c++ - 在 C++ 程序中确定运行时的堆栈大小

C++初学者关于输入/输出文本文件的问题。?

c++ - 从 wchar_t 转换为 char,反之亦然

javascript - 我应该在 AngularJS 中使用关联数组吗?

javascript - 将数组与其自身连接起来以复制它

java - 在不迭代的情况下创建与另一个大小相同的多数组的快速方法?

arrays - 如何在不知道c中大小的情况下遍历数组

C 中指向指针数组的 Char 指针

c++ - 错误的 "control reaches end of non-void function"gcc 警告怎么办?