sizeof 关键词解析

很久以前,我就遇到这类的问题,今天算是有时间了,由我来和大家一起看看这个大家可能经常会遇到的问题。

在主函数内有效,而改进到方法中却失效

博主这里用的是64位电脑,在32位电脑中可能非main函数的方法内的for循环仅运行一次

main函数:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;

int main() {
int arr[]={1, 2, 3, 4, 5}; //定义一个数组
int ans=0;
for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
ans+=arr[i];
}
cout << ans << endl;
return 0;
}

输出内容为:

​ 15

​ 进程已结束,退出代码为 0

非main函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;

int solve(int arr[]) {
int ans=0;
for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
ans+=arr[i];
}
return ans;
}

int main() {
int arr[]={1, 2, 3, 4, 5}; //定义一个数组
cout << solve(arr) << endl;
return 0;
}

输出内容为:

​ 3
​ 进程已结束,退出代码为 0

这里输出为3是因为sizeof(arr)/sizeof(int)为2,导致i走到了下标1,所以结果为1+2=3

为什么在main方法中和main方法外不一样呢?

因为在solve方法中传参为(int arr[])因为传的是数组所以一般等价于(int *arr)

众所周知,指针的占8字节(64位&8字节/32位&4字节),int类型占4字节,所以理所当然导致了sizeof关键词/方法不生效。

解决方案

  1. 这里可以放到全局中,直接使用数组
  2. 直接测量测量长度(循环遍历)