2011-02-10 15 views
2
class Simple { 
     string *data ; 
     //some functions and declaration of some variable,const, dest 
}; 

私がしたとき、なぜsizeof Variablename/sizeof * VariableNameは必要に応じて機能しませんか?

data = new string [10] ; 

cout << sizeof data/sizeof *data << endl ; 

==> 1 // output 


data = new string [50]; 
cout <<sizeof data/sizeof *data <<endl ; 

==> 1 // output 

**Why** do all output display the same ? 
+1

[C - > sizeof stringは常に8 ...]の可能な複製(http://stackoverflow.com/questions/4941142/c-sizeof-string-is-always-8) –

答えて

5

これはまったく機能しないためです。

は、それだけでこのように宣言されている昔ながらの配列のために働く:

string a[10]; 

、それが唯一のケース。この作品です。

あなたの場合は、あなたが持っているポインタからサイズを取得することはできません。あなたが持っているもののサイズを格納するか、すべて.size()メンバを持つSTLコンテナを使用するだけです。後者が好ましい。

+0

あなたはおそらくchar a [10]; –

+1

いいえ、OPが望んでいるように、文字列a [10]を意味しません。(彼は新しい弦を作った[10]) – BatchyX

+0

"at all"の意味は何ですか? –

2

sizeof dataとは何ですか? string*のサイズです。 sizeof *dataとは何ですか? dataが指しているサイズ、つまり、サイズはです。これらはどちらも一定です。

dataあなたが割り当てた要素の数についての知識はありません。それは単なる愚かなポインタです。

覚えておいてください。sizeofは常にコンパイル時に評価されます。したがって、newのように実行時に発生することについては、sizeofの情報を得ることはできません。

3

sizeofはコンパイル時の計算であり、実行時の計算ではないためです。また、配列のサイズは実行時まで認識されません。あなたが割り当てられたか、バッファの大きな問題ではありませんか、まったくバッファを割り当てられさえするよう

sizeofは、にどこポインタポイントについて何も知りません。

data = NULL; 
x = sizeof(*data); 

コンパイル時に計算されるため、ヌルポインタ逆参照はありません。

sizeofは、のデータ型のみを参照し、データ自体は渡しません。この場合、string*となります。これは、どこにポイントしても同じサイズです。

あなたはこの「仕事」を作るためにいくつかのオプションがあります。

  1. あなたsizeofイディオムを使用することができ、静的サイズの配列(例えばstring data[50];)を使用し、もちろんあなたは、すべての標準の限界を取得静的配列を返します。
  2. newを使用して動的に割り当て続けますが、配列のサイズを格納し、必要な場所に渡してください。
  3. 好ましいもの:std::vectorをアレイに使用する - これは基本的にすべての世界の中で最高です。
関連する問題