sizeof() 在 C++11 中的行为如何?

How does sizeof() behaves in 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.

当您将数组作为参数传递给函数时..它作为指针传递 (int *arr)..这就是为什么它在二进制搜索函数中是 4ì。