c++ - sizeof() 在 C++11 中的行为如何?
问题描述
c++ 中的 sizeof() 函数的行为非常奇怪。我无法理解它。我正在编写代码来实现二进制搜索算法来查找数组中的元素。为了减少函数中的参数数量,我决定使用 sizeof() 函数获取数组的长度。这是代码:
#include <bits/stdc++.h>
using namespace std;
int binarySearch(int arr[], int target) {
int low = 0;
int high = sizeof(arr) / sizeof(arr[0]) - 1;
cout << "high is: " << high << endl;
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] > target) high = mid - 1;
else low = mid + 1;
}
return -1;
}
int main() {
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout << binarySearch(array, 10) << endl;
cout << "size of behaviour in main: " << sizeof(array);
return 0;
}
输出是:
high is: 0
-1
size of behaviour in main: 40
在调试时,我意识到在 binarySearch 函数内部,sizeof(arr) 给了我 int 类型的大小,即 4。所以 sizeof(arr)/sizeof(arr[0])-1 = 4/4-1 = 0。
然而,在 int main 中,sizeof(array) 给了我 int 乘以数组长度的大小,即 4*10 = 40。
是什么解释了 sizeof() 函数在 int main 和函数定义中的使用方面的这种行为变化?
解决方案
当您获得指针的 sizeof 时,这不起作用。重构代码以使用模板是一种解决方案:
#include <iostream>
using namespace std;
template<std::size_t N>
int binarySearch(int (&arr)[N], int target) {
int low = 0;
int high = sizeof(arr) / sizeof(arr[0]) - 1;
cout << "high is: " << high << endl;
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] > target) high = mid - 1;
else low = mid + 1;
}
return -1;
}
int main() {
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout << binarySearch(array, 10) << endl;
cout << "size of behaviour in main: " << sizeof(array);
return 0;
}
使用 std::array 可能是一个更好的选择。模板和 std::array 的大小在编译时都是已知的。如果您想要运行时方法,请查看 std::vector。
推荐阅读
- swift - SwiftUI:添加 ScrollView 时如何忽略 NavigationView
- docusignapi - DocuSign 代理/指定收件人角色
- jasper-reports - 带有子报表的报表显示空白页
- javascript - CSS 文本居中对齐已关闭
- python-3.x - 在 conda forge 中发布包收到错误“我的包需要未安装的 pathlib”
- mongodb - 数组中的MongoDB查询
- sql - 当使用 case 语句聚合 redshift 中的字段时,用 1 和 0 替换二进制字段是否更高效?
- database - 在具有单独数据库的多租户中 - 如何为用户登录创建集中式服务?
- node.js - 在 nodejs 中的 app.post 到 app.get 之间传递数据
- sql - SQL:复合主键作为外键