-2

他のタイプのデータを含む配列に対して、C++sizeof(array) が異なる方法で動作するのはなぜですか?bool array

版 : お願いだから

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

boolarray のサイズを指定しないでください。

しかし、この単純なコードは以下を出力します:

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 日目です。愚かな質問で申し訳ありません。

4

3 に答える 3

4

動作が異なるわけではありません。それができると思う理由は何ですか?のサイズについて間違った仮定をしていboolますか?


コメントでほのめかされているように、配列を関数に渡してそのサイズを計算しようとすると、うまくいきません。配列を関数に渡す (または関数から返す) ことはできません。例えば:

void foo(int array[10])
{
    auto size = sizeof(array);
    // size == sizeof(int*), you didn't pass an array
}
于 2013-02-28T23:30:01.430 に答える
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::arrayこれは、C スタイルの配列よりもクセが少ない、またはstd::vectorアドバイスできる理由の 1 つです。

于 2013-02-28T23:45:09.950 に答える
1

他の人が説明したように、配列は関数に渡されるとポインターに退化します。

ただし、回避策が 1 つあります。テンプレートを使用できます。

template<typename T, size_t N>
size_t length(T (&)[N]) {
    return N;
}
于 2013-02-28T23:43:08.293 に答える