sizeof()在C++11中是如何表现的?[重复]

问题描述 投票:0回答:1

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 = 44-1 = 0.

然而,在int main中,sizeof(array)给我的是int的大小乘以数组的长度,即4*10 = 40。

为什么 sizeof() 函数在 int main 和函数定义中的使用会有这种行为变化?

c++ arrays c++11 binary-search sizeof
1个回答
0
投票

那是行不通的,因为你得到的是一个指针的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。


0
投票

当你把一个数组作为参数传递给一个函数时,它是以指针(int *arr)的形式传递的,这就是为什么它在二进制搜索函数中是4。

© www.soinside.com 2019 - 2024. All rights reserved.