You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++11传递数组给函数后用sizeof获取大小错误的问题

问题根源:数组传递时的指针退化

你遇到的问题核心是数组作为函数参数传递时会隐式退化为指针,导致函数内部无法通过sizeof获取原数组的实际大小。

具体分析

在你的代码中:

int calcualteSkyLine(const int* skyline)
{
    int arrSize = sizeof(skyline) / sizeof(int); // 这里的skyline是指针,不是数组
    // ...
}

当你在main里传递buldingArry(数组名)给calcualteSkyLine时,数组名会被自动转换为指向数组第一个元素的指针。在64位系统中,指针的大小是8字节,sizeof(int)为4字节,所以计算得到的arrSize是2,再加上循环条件i <= arrSize,自然无法遍历完整数组。

另外你提到替换为10能运行,但原数组buldingArry实际有11个元素({1,3,2,1,2,1,5,3,3,4,2}),替换为11才是正确的遍历边界。

解决方案

这里提供三种常用的解决方式:

1. 显式传递数组大小作为参数

直接把数组的实际大小作为额外参数传给函数,这是C风格的经典解决方案:

#include <iostream>

// 新增数组大小参数
int calculateSkyLine(const int* skyline, int arrSize)
{
    for(int i = 0; i < arrSize; i++) // 注意用<而不是<=,避免越界
    {
        std::cout << skyline[i] << std::endl;
    }
    return 0;
}

int main(int argc, char** argv) // 注意参数顺序:argc是参数个数,argv是参数数组
{
    const int buildingArray[] = {1,3,2,1,2,1,5,3,3,4,2};
    // 计算数组实际大小并传递
    int size = sizeof(buildingArray) / sizeof(int);
    calculateSkyLine(buildingArray, size);
    return 0;
}

2. 使用模板函数让编译器推导数组大小

利用C++模板的特性,让编译器在编译期自动推导数组的长度:

#include <iostream>

// 模板参数N自动推导数组大小
template <size_t N>
int calculateSkyLine(const int (&skyline)[N])
{
    for(int i = 0; i < N; i++)
    {
        std::cout << skyline[i] << std::endl;
    }
    return 0;
}

int main(int argc, char** argv)
{
    const int buildingArray[] = {1,3,2,1,2,1,5,3,3,4,2};
    calculateSkyLine(buildingArray); // 直接传数组,编译器自动推导N=11
    return 0;
}

3. 使用C++标准容器(推荐)

放弃原生数组,改用std::vector或std::array,这类容器自带大小获取方法,更符合现代C++的编程习惯:

#include <iostream>
#include <vector>

int calculateSkyLine(const std::vector<int>& skyline)
{
    // 用范围for循环遍历,更简洁
    for(int height : skyline)
    {
        std::cout << height << std::endl;
    }
    return 0;
}

int main()
{
    std::vector<int> buildingArray = {1,3,2,1,2,1,5,3,3,4,2};
    calculateSkyLine(buildingArray);
    return 0;
}

额外注意

你的代码里还有几个小问题:

  • 函数名拼写错误:calcualteSkyLine → calculateSkyLine
  • 数组名拼写错误:buldingArry → buildingArray
  • main函数参数顺序错误:应该是int argc, char** argv(第一个参数是参数个数,第二个是参数数组)

内容的提问来源于stack exchange,提问作者user63898

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:10:19