使用指针的数组长度
array length using pointers
数组
长度可以使用*(&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 计算
仅当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;
}
在main()
中,编译器知道arr
是一个大小5 * sizeof(int)
数组。func()
编译器所知道的只是arr
是指向内存块的指针 - 它没有关于数组大小的信息,甚至没有关于它是一个数组的信息(例如,它可能只是通过malloc()
分配的内存块(。
当您将数组传递给函数时,它会衰减为指针,并且对其大小的知识将丢失。 func 可以接受任何大小的数组,那么如何确定大小呢?您必须将数组的大小作为额外参数传递,或者使用数据结构,例如 std::vector 或 (C++11( std::array,它们会跟踪它们的大小。
相关文章:
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”