c++中sizeof函数求数组长度的一些坑

#include<iostream>
#include<string>
using namespace std;
void test(int *a){//数组参数实际以数组首地址指针传递
    int len = sizeof(a) ;//指针字节数
    char *p;
    int len2=sizeof(p);//不论指针类型,32位系统指针4字节;编译器为了兼容性,这里取32位地址
    int len3 = sizeof(a) / sizeof(a[0]);//指针4个字节,int 4个字节
    cout << len <<len2<<len3<< endl;//结果4 4 1
}
int main() {
    int a[8] = { 1,2,3,4,5,6,7,8 };
    int len = sizeof(a) / sizeof(a[0]);//这里a指针指向整个数组,a[0]为首元素所占字节,结果 8
    cout << len << endl;
    test(a);
    return 0;
}

 

### 使用 `sizeof` 函数计算 C/C++ 数组长度 当在全局作用域或局部变量声明处使用 `sizeof` 来计算数组大小时,可以直接得到整个数组占用的字节数。对于一维数组而言,可以通过除以单个元素所占空间的方式获得数组的实际长度。 ```cpp int array[10]; size_t length = sizeof(array) / sizeof(array[0]); ``` 然而,在函数内部尝试对作为参数传递进来的数组应用同样的方法会遇到问题[^1]。这是因为当数组被当作参数传递给函数时,它实际上退化成了指针类型,因此 `sizeof(data)` 只能返回该类型的大小而非原始数组的真实尺寸[^2]。 为了克服这一局限性并正确地获取传入函数内的数组长度,通常有两种解决方案: #### 方法 1: 显式传递数组长度 最简单的方法是在调用函数的同时提供额外的一个参数用于指定数组长度。 ```cpp void processArray(int data[], size_t length); // 调用方式 processArray(myArray, sizeof(myArray)/sizeof(myArray[0])); ``` 这种方法不仅清晰明了而且不容易出错,推荐优先考虑此方案。 #### 方法 2: 利用模板推导数组维度 如果希望保持接口简洁,则可以利用C++中的模板特性自动推导出数组的具体信息。 ```cpp template<typename T, size_t N> void processArray(T (&array)[N]){ // 此时可以在函数体内安全地使用 N 表示数组长度 } ``` 这种方式能够有效避免手动管理数组边界的风险,并且编译器会在编译期完成必要的验证工作,从而提高了程序的安全性和可靠性[^3]。 需要注意的是,对于字符串这样的特殊形式的一维字符数组来说,还可以借助标准库提供的 `strlen()` 函数来快速得其不含终止符的有效字符数[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值