【发布时间】:2020-08-28 01:17:54
【问题描述】:
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 和函数定义中的使用方面的这种行为变化?
【问题讨论】:
-
int arr[]在此上下文中不是您可能认为的数组。因此int high = sizeof(arr) / sizeof(arr[0]) - 1;没有意义。 -
我很好奇你为什么认为 c++11 改变了一些东西
-
@NiclasLarsson 我现在明白 arr 只是一个指针,而不是一个数组。但是,我仍然不想在函数参数中明确给出 int 大小。有什么办法吗?
-
看看
std::vector。 -
将函数更改为
template <size_t N> int binarySearch(int (&arr)[N], int target),那么函数中的数组大小为N。呼叫站点是相同的。 ideone.com/bt0Du1
标签: c++ arrays c++11 binary-search sizeof