【问题标题】:Why in C++ sizeof(array[]) behave in different way for bool array? [duplicate]为什么在 C++ sizeof(array[]) 中,布尔数组的行为方式不同? [复制]
【发布时间】:2023-03-12 06:30:02
【问题描述】:

为什么在 C++ 中 sizeof(array) 对于 bool array 的行为方式与包含其他类型数据的数组不同?

版本: 我问是因为

sizeof(boolarray)/sizeof(boolarray[0])

不要给出布尔数组的大小。

但是这个简单的代码会打印出来:

4
1

/////////////////////////

#include<iostream>
using namespace std;
void printBoolArray(bool* boolarray){
    cout<<sizeof(boolarray)<<"\n";
    cout<<sizeof(boolarray[0]);  
}


int main(){
    bool boolarray[10]={false};
    printBoolArray(boolarray);
}

知道我理解函数中的 sizeof 给出了引用的对象的大小,这是我使用 c++ 的 9 天,抱歉这个愚蠢的问题,现在很明显

【问题讨论】:

  • 关心扩展以不同的方式表现
  • sizeof(array) 乘以 sizeof(bool) 中的数组大小,这取决于实现。让我们说它是一个字节。你期待的结果是什么?
  • 这里有一些证明尺寸技巧仍然有效的证据:liveworkspace.org/code/3PX678%240
  • 您是否尝试过使用任何其他数据类型?
  • @Qbik:我在你发布代码之前回答了你的问题。

标签: c++ arrays boolean


【解决方案1】:

它的行为并没有什么不同。是什么让你认为它确实有效?您是否对bool 的大小做出了错误的假设?


正如在 cmets 中提到的那样,如果您将数组传递给函数并尝试在那里计算其大小,那是行不通的。您不能将数组传递给(或从)函数返回。例如:

void foo(int array[10])
{
    auto size = sizeof(array);
    // size == sizeof(int*), you didn't pass an array
}

【讨论】:

  • 因为以下获取数组大小的技巧不适用于 bool :sizeog(boolarray)/sizeof(boolarray[0])
  • @Qbik:是的。给我一个例子,说明它没有。同样,我相信您正在假设 sizeof(bool) 应该返回什么,但 sizeof(bool) 取决于实现。
  • @Qbik 请告诉我,您将boolarray 作为参数传递给的函数内部没有该表达式?如果是这样,这已经在 SO 上被问了一百万次,它不适用于任何数据类型,更不用说bool。要找出原因,请在 C 或 C++ 标记中搜索 array decay to pointer
  • 我认为你们都应该放松 Qbik,顺便说一句...每个人都必须以某种方式学习。
  • @StephenLin:是的,每个人都从某个地方开始,但每个人都应该知道如何寻求帮助。问题是最初的问题过于模糊,做出了错误的断言,并且没有提供示例。
【解决方案2】:
#include <cstddef>
#include <iostream>

template<std::size_t n>
void printBoolArray(bool (&boolarray)[n]){
  std::cout<<sizeof(boolarray)<<"\n";
  std::cout<<sizeof(boolarray[0]);  
}

int main(){
  bool boolarray[10]={false};
  printBoolArray(boolarray);
}

以上工作。

sizeof(bool*) 是指针的大小,而不是它指向的数组。

以上,我仔细维护了boolarray的类型。碰巧,此技术还将大小提取到编译时常量n

这不能很好地扩展,因为当您将数组传递给函数时,它们会迅速衰减为指针。这就是为什么可以建议 std::arraystd::vector 的原因之一——它们的怪癖比 C 样式数组少。

【讨论】:

  • 有趣,模板的语法类似于我的糟糕尝试,除了 [n] 似乎与 std::size_t 连接,这是 sizeof 生成的类型名称,但我在这里看不到机制...整个机制必须隐藏在模板中
  • 基本上我接受一个数组并避免它衰减成一个指针。请注意,[] 只是替代指针语法。
【解决方案3】:

正如其他人所解释的,数组在传递给函数时会退化为指针。

但是,有一种解决方法;你可以使用模板。

template<typename T, size_t N>
size_t length(T (&)[N]) {
    return N;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 2012-05-29
    • 2018-11-02
    • 2021-12-17
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多