sizeofについて - RとLinuxと...

RとLinuxと...


sizeofについて

Programming

sizeof の使い方を多少誤解していた.ここにこんな情報がある.ついでに,授業などで以下は使える.引用する.

for ループの例 sizeofの使い道の一つとしてforループのループ数の指定にあります. forの例

double data[50];
double sum = 0;
for(int i = 0; i < sizeof(data) / sizeof(data[0]); ++i){
   sum += data[i];
}

ここで,sizeof(data)は,data[50]全体を指しますので,8 (double型のサイズ) x 50 = 400 となります. 次に,sizeof(data[0])は,一つの要素を指しますので,8 (double型のサイズ) となります. そのため,400 / 8 = 50となり,dataの持つ要素数となります. この方法で書いておくと,dataの型を変更した場合や,要素の数を変更した場合でもforの条件を書き換えずに,要素全てに対して処理をおこなうことができます. forに使えない例

double *data;
double sum = 0;
data = (double*)malloc(sizeof(double) * N);
for(int i = 0; i < sizeof(data) / sizeof(data[0]); ++i){
   sum += data[i];
}
free(data);

ここで,sizeof(data)は,data全体ではなく,dataの型つまりdouble *のサイズを示してしまいます.そのため,前の例のように,Nの回数分だけforの処理をすることはできません.

例としてこんなプログラムを作成(石田作成)

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main(int arg, char *argv[]){

 string str[] = {"cake", "cheese", "cherry"};
 int x;

 cout << "how many elements in str?  " << 
       (x = sizeof(str)/sizeof(str[0])) << endl;

 for(int i = 0; i < x; i++){
	cout << "length of str[" << i << "]=" 
              << str[i].length() << endl; 
  }

 // vector クラスを使ってみる
  vector<string> vec;

 vec.push_back("cake");
 vec.push_back("cheese");
 vec.push_back("cherry");

 // while(vec.size())でも良いが iterator を使うと
 x = 0;
 vector<string>::iterator pv = vec.begin();
 while(pv != vec.end()){
	cout << "vec." << x++ << " = " << *pv++ << endl;
 }
  
 return 0;  

}
 
Link: Programming(3061d) Programming_C(3511d)
Last-modified: 2008-02-02 (土) 17:14:04 (4003d)