こんにちは。
教えていただきたいのですが、クラスメンバ(変数)を動的に確保することは
できるのでしょうか?(一応やってみたのですが、エラーになってしまいました。)
それから、Newでの二次元配列の確保は、どうやったらよいのでしょうか?
ヘルプでもうまく探せません。
よろしくお願いします。

A 回答 (3件)

ポインタをクラスメンバにしておいて、


newが返すポインタをそこに入れる、
というのでだめですか?

class Integers {
 public:
  Integers() : ip(0) { }
  ~Integers() { if( ip != 0 ) delete[] ip; }

  allocate(int n){ ip = new int[n]; }

 private:
  int *ip;
};


2次元配列の確保は、こんな感じでどうでしょう?

int (*twodim)[CNUM]
 = reinterpret_cast<int (*)[CNUM]>(new int [CNUM * RNUM]);

CNUMとRNUMは列数、行数を表す定数です。
CNUM*RNUM個のintを確保して、
CNUM個のintをひとまとめにして指すポインタに
castして代入しています。

これで、twodim[1]は2行目のint配列の先頭を指すポインタになるので、
twodim[1][2]で、2行目の第3列目の要素を指します。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
教えて頂いたように、ポインタをメンバにすることで
対応できました。
二次元配列のほうも、いけそうです。
本当にありがとうございました。
またよろしくお願いいたします。

※昨日のうちにお礼を書き込みしたのですが、
 うまく送信できていなかったみたいです。
 遅くなってすみません。

お礼日時:2001/06/23 14:09

> 動的確保ですが、クラス宣言の中に


> int *p = new int;
> を書き込んだだけです。

 クラス宣言はあくまで「型情報の定義」であって、インスタンス(強いて言うならクラス型変数)が作成されるわけではありません。
 従ってakika0215さんの記述はエラーとなったわけです。
 (変数領域が確保されないのだから、newの結果を受け取れないのは当然ですよね)

> ポインタをメンバにして参照することで、回避できたのですが、
> 他にも良い方法がありましたら教えて下さい。

 動的に確保するのであれば、ポインタ型メンバを持つのが手っ取り早くてよいと思いますよ。
 ただ、この動的確保を行うのがメインとなるクラスでないのであれば、動的確保とその領域へのアクセスを行うためだけのクラスを書いて、そのオブジェクトをメンバに持つようにするとよいかと思います。
    • good
    • 0
この回答へのお礼

再度ご回答いただきましてありがとうございます。
とても勉強になりました。
またどうぞよろしくお願いいたします。

お礼日時:2001/06/26 00:21

∇動的確保について(補足要求)


 どのようなコードを書いたらエラーになったのでしょう?

∇二次元配列の確保について
  const int col = 10;
  int (*p)[col];   //「要素をcol個持つint型の配列」への「ポインタp」の宣言
  int row;

  cin >> row;
  p = new int[row][col];

  for (int ir = 0; ir < row; ir++) {
    for (int ic = 0; ic < col; ic++) {
      p[ir][ic] = ir * col + ic;
      cout << p[ir][ic] << ends;
    }
    cout << endl;
  }

  delete [ ] p;

 これではダメですか?
※1次元以外の次元は定数にする必要があります。
(ブラウザ上で見やすくするため、全角spaceを入れています。コピペする場合、注意して下さい。)

この回答への補足

こんにちは。ご回答ありがとうございます。

動的確保ですが、クラス宣言の中に
int *p = new int;
を書き込んだだけです。
想像がつかなかったので、ただ単純にやってしまいました。
ポインタをメンバにして参照することで、回避できたのですが、
他にも良い方法がありましたら教えて下さい。

補足日時:2001/06/23 13:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q私を見下す夫

先日、「君なんかに比べると俺の方が賢い」と平然と言われました。
仕事(結婚前同僚でした)にしろ、性格にしろ、知識量にしろ、すべて私は自分より劣っていると夫が思っていることはわかっていましたが、こうもはっきり言われると驚きました。
昨夜も食事中に、「99+88は?」と聞いてきました。
私は暗算が苦手なのですが、夫が何をしたいのかわかったので私は無視しました。
すると、やはり得意満面に計算の仕方を説明しようとしたので怒りました。

こんな夫を無邪気とかアホだなとか思って流した方がよいのかとも思いますが、こう何度も繰り返すと本当に腹が立ちます。

夫は意志が弱く、根気もなく、目標を決めて努力することができない人です。
人種差別的発言も平気でします。
それなのに、根拠はわかりませんが、自分には相当自信をもっているみたいです。
だから余計に夫がレベルの低い、浅い人間に見えて仕方ない時があります。

こんな夫の性格を治すことなんてできるとは思っていませんが、こういう人を選んで結婚してしまった自分を責める他ないのでしょうか。

Aベストアンサー

どうもコンプレックスがあるようですね、この旦那さん。
会社でストレスを溜めて帰ってきても、本来癒してくれるはずの奥様に劣等感を感じてしまって、
それが裏目に出ているようにも思えます。

本当は奥さんに思い切り甘えたいのに出来ないんでしょうね。家にいて素の自分が出せないのは苦しいですよ。奥さん何でもテキパキやる方じゃないですか?甘えにくいのかもしれませんよ旦那さん。もうちょっとソフトな雰囲気を作るようにしたらいいんじゃないかな。

例えば何を決めるにしても旦那さんにちょっと相談するようにすればいいです。二人の力で何事も成し遂げたよう見せれば、かけがえのないパートナーだと再認識させることが出来るかもしれませんよ。まずそんなにカリカリしないで、奥さんの方から少し歩み寄ってみましょうよ。

それから、もし馬鹿にされても悔しそうな素振りを見せないことです。そうなれば馬鹿にした甲斐がありますからね。表情に出さずスーッと流しなさい。
間違っても『私のような馬鹿な女と結婚したあなたは何なの!』なんていっちゃダメですよ(笑)

Q3次元配列の動的確保

2次元配列は、

// 動的確保
int **mat = new int*[row];
for(i = 0; i < row; i++)
mat[i] = new int[col];


//解放
for(i = 0; i < row; i++)
delete [] mat[i];
delete [] mat;

で、生成と開放はできたのですが、3次元となると、途端にわからなくなります。
かれこれ1時間半は試行錯誤はしているのですが、たどり着きそうにありません。
どなたかご教授願います。

Aベストアンサー

No6 ency です。

> delete[][] というのがミソでしょうか。
> 恥ずかしながらはじめて見ました。

lachesis-r さんはぜんぜん恥ずかしくないです。
逆に、恥ずかしいのは私です。。。

該当箇所は、

delete[] mat[i][j]

で置き換えてください。

# 私もなんて恥ずかしいミスをしてしまったのか・・・。

Q動的に領域確保した三次元配列のbus error

現在c言語でプログラミングをしているのですが、動的に領域確保した三次元配列に値”0”を入れようとすると、bus error が発生してしまいます。使用しているのはMac OS X 10.5.8 powerPC G5です。

ソースは以下のようになっています
for(i=0;i<M*J;i++){
for(j=0;j<N;j++){
for(k=0;k<Q;k++){
BETA[i][j][k]=0.0;
ALPHA[i][j][k]=0.0;
}
}
}
このとき、M、J、N、Qはそれぞれint型の定数です。
gdbしてみると結果はこのようになります。
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x00004208 in sum_product_decode (H=0x1001f0, y=0x100880, transH=0x1002c0, get=0x100760, get_ve=0x100790, snr=6, count=0, matrix=0xbffff140, vector=0xbffff020, synd=0xbffff130) at n_b_LDPC.c:626
626 BETA[i][j][k]=0.0;

ご指摘よろしくお願いします。

現在c言語でプログラミングをしているのですが、動的に領域確保した三次元配列に値”0”を入れようとすると、bus error が発生してしまいます。使用しているのはMac OS X 10.5.8 powerPC G5です。

ソースは以下のようになっています
for(i=0;i<M*J;i++){
for(j=0;j<N;j++){
for(k=0;k<Q;k++){
BETA[i][j][k]=0.0;
ALPHA[i][j][k]=0.0;
}
}
}
このとき、M、J、N、Qはそれぞれint型の定数です。
gdbしてみると結果はこのようになります。
Program received signal EXC_BAD_ACCESS, Could not...続きを読む

Aベストアンサー

>"double"だとおもいます。

ですよね。
この考え方を拡張すると、
double ***BETA;
と定義したBETAが指すのは、double ** 型ですので、
BETA = (double ***) malloc(sizeof(double **) * M * J);
であることに気づきますか?

つまり、動的確保を行なう際に、
(double ○○) malloc(sizeof(double △△) * 領域確保したい大きさ);
と書いたとき、
○○ に書く * の数が △△ に書く * の数より1個多い、
という関係があることに気づきますか?

Qアドレス格納のための二次元配列のメモリ動的確保

アドレス格納のための二次元配列のメモリ動的確保

二次元配列のためにメモリを動的確保しなければならないのですが、
その配列に格納したいものが
「DATA型のポインタ」です。(DATA型はtypedefした構造体です。)

プログラム実行中にmallocで確保した、数あるDATA型の構造体の、その先頭アドレスを
リストアップするための配列です。

この場合、どのような形でmallocすればよいのでしょうか?
教えていただけるとありがたいです。よろしくお願いいたします。

--

たとえば m×n のint型の配列は、
◆ int *i;
◆ i = (int *)malloc( m * n * sizeof(int) );
となりますよね。
この要領がでやるのが一般的にわかりやすいものだとするならその方法でやりたい
(後発の人が自分のソースコードを読む可能性があるため)のです。

--

同様にm×nの「DATA型のポインタを格納するための二次元配列」を動的確保したい場合、

◆ DATA *d;
◆ d = (DATA *)malloc( m * n * sizeof(DATA) );

この文にどのように付け加えたら良いのでしょう?



もうあと一歩な気がするのですが(笑)。しかし参考書等で勉強しましたがわかりませんでした・・・。
わかる方、どなたかよろしくお願いいたしますm(_ _)m
あとこれだけ通ればコンパイルが通るんです!!!!! たぶん(笑)

アドレス格納のための二次元配列のメモリ動的確保

二次元配列のためにメモリを動的確保しなければならないのですが、
その配列に格納したいものが
「DATA型のポインタ」です。(DATA型はtypedefした構造体です。)

プログラム実行中にmallocで確保した、数あるDATA型の構造体の、その先頭アドレスを
リストアップするための配列です。

この場合、どのような形でmallocすればよいのでしょうか?
教えていただけるとありがたいです。よろしくお願いいたします。

--

たとえば m×n のint型の配列は、
◆ int *i...続きを読む

Aベストアンサー

m×n の int の配列を
◆ int *i;
◆ i = (int *)malloc( m * n * sizeof(int) );
とするのが「ふつう」なのかなぁ? メモリを節約したいならともかく, そうでなければ
int **i;
i = malloc(m * sizeof (i[0]));
i[0] = malloc(m*n*sizeof (i[0][0]));
/* 以下 i[1]~i[m-1] に確保した領域を分配する */
の方がいいんじゃないかねぇ. ま, ど~でもいいけど.

さておき, 自分で書いた「int の場合」をよく見てください. ここは「int」と明示してあるけど, もっと一般に「T」という型なら当然
T *array;
array = (T *)malloc(m*n*sizeof (T));
でしょ? この「T」に, 適切なものを入れればいい. そんだけ.

Q文字列配列をメンバにもつ構造体の,メモリ動的確保

下に同様の質問があるのですが,やはり理解できません.
文字列配列をメンバにもつ構造体の,メモリを動的に確保をしたいのですが,うまくいきません.
具体的には以下のようです.
正しくはどのようにすればよいでしょうか.よろしくお願いします.

typedef struct {
char **boy;
char **girl;
} Name_class;

int init_name_class(Name_class name_class, int n_boy, int n_girl)
{
int i;

name_class.boy = (char**) malloc( n_boy * sizeof(char**) );
for(i=0; i<n_boy; i++)
name_class.boy[i] = (char*) malloc( 32 * sizeof(char*) );

name_class.girl = (char**) malloc( n_girl * sizeof(char**) );
for(i=0; i<n_girl; i++)
name_class.girl[i] = (char*) malloc( 32 * sizeof(char*) );
}


main(int argc, char *argv[])
{
int i, j, n_boy=3, n_girl=2;
Name_class name_class;

init_name_class(name_class, n_boy, n_girl);

name_class.boy[0] = "yukio";
name_class.boy[1] = "hideaki";
name_class.boy[2] = "mitsuru";

name_class.girl[0] = "youko";
name_class.girl[1] = "chiharu";

printf("%s, %s, %s, %s, %s\n", name_class.boy[0], name_class.boy[1], name_class.boy[2], name_class.girl[0], name_class.girl[1]);
}

下に同様の質問があるのですが,やはり理解できません.
文字列配列をメンバにもつ構造体の,メモリを動的に確保をしたいのですが,うまくいきません.
具体的には以下のようです.
正しくはどのようにすればよいでしょうか.よろしくお願いします.

typedef struct {
char **boy;
char **girl;
} Name_class;

int init_name_class(Name_class name_class, int n_boy, int n_girl)
{
int i;

name_class.boy = (char**) malloc( n_boy * sizeof(char**) );
for(i=0; i<n_boy; i++)
...続きを読む

Aベストアンサー

×name_class.boy = (char**) malloc( n_boy * sizeof(char**) );
○name_class.boy = (char**) malloc( n_boy * sizeof(char*) );
メンバboyは、char**のサイズの領域をn_boy個ではなく、char*のサイズの領域をn_boy個欲しい筈。

×name_class.boy[i] = (char*) malloc( 32 * sizeof(char*) );
○name_class.boy[i] = (char*) malloc( 32 * sizeof(char) );
boy配列の各要素は、char*サイズの領域が32個分ではなく、charサイズの領域が32個分、つまりは32文字分の領域が欲しい筈。

以下、girlメンバについても同様。

更に、
init_name_class(name_class, n_boy, n_girl);
で動的にメモリ確保したのに
name_class.boy[0] = "yukio";
name_class.boy[1] = "hideaki";
name_class.boy[2] = "mitsuru";
name_class.girl[0] = "youko";
name_class.girl[1] = "chiharu";
とやってしまうと、動的に確保したメモリのポインタは忘れ去られ、スタティックな文字列へのポインタが配列要素に上書き代入されます。

そして、動的に確保したメモリは取り残され、だれも開放すること無く残ります。これをメモリリークと言います。

多分、free関数で開放してないのは「開放しようとするとメモリエラーで例外が発生してアプリが飛ぶ」からでしょうけど、動的に確保したメモリのポインタを書き潰してるので、メモリエラーが出て当然です。

strncpy(name_class.boy[0],"yukio",31);
name_class.boy[0][31]='\0';
strncpy(name_class.boy[1],"hideaki",31);
name_class.boy[1][31]='\0';
strncpy(name_class.boy[2],"mitsuru",31);
name_class.boy[2][31]='\0';
strncpy(name_class.girl[0],"youko",31);
name_class.girl[0][31]='\0';
strncpy(name_class.girl[1],"chiharu",31);
name_class.girl[1][31]='\0';
のように、(1つに付き32バイト分確保した)メモリに31文字以内で文字列コピーしましょう。

strncpyは、コピー時に指定したバイト数を超えそうになると終端文字の\0を書き込まないので、念の為32文字目に\0を書いておくようにしましょう。

また、mainが終る前に、free関数で確保したメモリを開放しましょう。開放の順番間違いや開放し忘れは、メモリリークの原因になります。

以下の2つのプログラムの違いが判りますか?

main()
{
 char *p;
 p = "test";
 printf("%s\n",p);
}

main()
{
 char *p;
 p = (char *)malloc(10 * sizeof(char));
 strncpy(p,"test",9);
 p[9]='\0';
 printf("%s\n",p);
 free(p);
}

以下の2つのプログラムは正しくありません。判りますか?(実行するとメモリエラーで例外終了します)

main()
{
 char *p;
 p = (char *)malloc(10 * sizeof(char));
 p = "test";
 printf("%s\n",p);
 free(p);
}

main()
{
 char *p;
 strncpy(p,"test",9);
 p[9]='\0';
 printf("%s\n",p);
}

×name_class.boy = (char**) malloc( n_boy * sizeof(char**) );
○name_class.boy = (char**) malloc( n_boy * sizeof(char*) );
メンバboyは、char**のサイズの領域をn_boy個ではなく、char*のサイズの領域をn_boy個欲しい筈。

×name_class.boy[i] = (char*) malloc( 32 * sizeof(char*) );
○name_class.boy[i] = (char*) malloc( 32 * sizeof(char) );
boy配列の各要素は、char*サイズの領域が32個分ではなく、charサイズの領域が32個分、つまりは32文字分の領域が欲しい筈。

以下、girlメンバについ...続きを読む

Q関数内での多次元配列のメモリの動的確保について

関数内で、参照渡しをして配列の動的なメモリの確保をしようとしているのですが、うまくいきません。

はじめに、main関数内で、
int main(void){
double *testdata1;
testdata1 = (double*)malloc( sizeof(double) * 10 );

if( testdata1 == NULL ){

printf( "ERROR:testdata1" );
exit(0);

}

testdata1[3] = 20.4;
printf( "test = %g\n", testdata1[3] );
}

を実行したところうまくいきました。
そこで、
int main(void){

double *testdata1;
Kakuho( &testdata1 );
printf( "test = %g\n", testdata1[3] );

}

void Kakuho( double **testdata2 ){

*testdata2 = (double*)malloc( sizeof(double) * 10 );

if( *testdata2 == NULL ){

printf( "ERROR:testdata2" );
exit(0);

}

*testdata2[3] = 20.4;

}

としましたが、成功してくれません。
コンパイルは通りますが実行するとエラーが発生して落ちます。
(上記のprintfのERRORではありません。)

動作環境はXPのVCC7です。よろしくお願いします。

関数内で、参照渡しをして配列の動的なメモリの確保をしようとしているのですが、うまくいきません。

はじめに、main関数内で、
int main(void){
double *testdata1;
testdata1 = (double*)malloc( sizeof(double) * 10 );

if( testdata1 == NULL ){

printf( "ERROR:testdata1" );
exit(0);

}

testdata1[3] = 20.4;
printf( "test = %g\n", testdata1[3] );
}

を実行したところうまくいきました。
そこで、
int main(void){

double *tes...続きを読む

Aベストアンサー

> *testdata2[3] = 20.4;
ここを
 (*testdata2)[3] = 20.4;
に直してください。

QC++のnew演算子で動的確保

new()を初めて使ってみました。
エラーは無かったけど、間違いがあったら教えてください。

#include <iostream.h>
main(){
int n = 0;
char* str = "mojisuufumei";
char* myValue;
while(!str[n])n++;
myValue = new char[n+1];
strcpy(myValue, str);
cout << myValue;
delete []myValue;
}

char*型のmyValueを動的確保したつもりです。
myValue[0], myValue[1], … のそれぞれの値を
unsignedにして宣言したい場合はどうしたらいいんですか?

#include <iostream.h>
main(){
int n = 0;
char* str = "mojisuufumei";
unsigned char* myValue;
while(!str[n])n++;
myValue = new unsigned char[n+1];
strcpy(myValue, str);
cout << myValue;
delete []myValue;
}

だと、strcpy()のとこでコンパイルエラーでした。

new()を初めて使ってみました。
エラーは無かったけど、間違いがあったら教えてください。

#include <iostream.h>
main(){
int n = 0;
char* str = "mojisuufumei";
char* myValue;
while(!str[n])n++;
myValue = new char[n+1];
strcpy(myValue, str);
cout << myValue;
delete []myValue;
}

char*型のmyValueを動的確保したつもりです。
myValue[0], myValue[1], … のそれぞれの値を
unsignedにして宣言したい場合はどうしたらいいんですか?

#include <iostream.h>
main(){
int n = 0...続きを読む

Aベストアンサー

こんにちは.Esnaです.

newの使い方としては,いいのではないでしょうか.
strcpy()のエラーは,strcpyの第1引数の型が,char *型を要求しているので発生しているのだと思います.
無理やり変数をchar *にキャストすれば,コンパイラは通るとは思います.

あとは,strcpy()を使うならstring.hをincludeしておいたほうがいいでしょう.(namespace使ってcstringでもいいです.)普通はしておかないとエラーになりますが,iostream.hの中のどこかでincludeされている場合もあるのでそのときは,普通に実行できますけどね.

Qnewを使った領域の動的確保

お世話になります。
C++での記述方法なのですが
構造体Testの領域を確保しておいて値を入れます。
確保しておいた領域では領域が不足するときに
不足分を追加したいのですがどうすればよいでしょう?
Cではreallocを使えばよいと思うのですが
C++ではmallocではなくnewを使ったほうがよいと聞きました。
newした領域を再定義した場合(deleteせずに領域を追加)
先に領域に入れたデータは保証されるのでしょうか?
以下例文ソース*部分
以下例文のソース
Test *a;
a = new TEST[10];
int cnt;
int i;
for(i = 0;i<10;i++){
 //ここでTESTの配列aに値を入れる
}
cnt = 12;
if( cnt > 10 ){
 //予想サイズを上回ったら足りない分のサイズの領域を確保し
 //データを入れる
 a = new[cnt];//*ここで領域を再確保したら元のa[0]~a[9]の
        //データは確実に保持されるのか?
        //または他に領域を確保する方法があるのか?
}
上記例文ソースでは先にcntで領域を確保すれば良いようにみえますが
やりたいことは
先に確保されている領域を広げて
先に入れてあったデータと、広げた領域に入れたデータを使いたい
のです。
分かりにくい文章かもしれませんがよろしくお願いします。

お世話になります。
C++での記述方法なのですが
構造体Testの領域を確保しておいて値を入れます。
確保しておいた領域では領域が不足するときに
不足分を追加したいのですがどうすればよいでしょう?
Cではreallocを使えばよいと思うのですが
C++ではmallocではなくnewを使ったほうがよいと聞きました。
newした領域を再定義した場合(deleteせずに領域を追加)
先に領域に入れたデータは保証されるのでしょうか?
以下例文ソース*部分
以下例文のソース
Test *a;
a = new TEST[10];
int cnt;
int i;...続きを読む

Aベストアンサー

直接newせずに、STLのvector等を使います。
この場合、delete[]も不要ですし、メモリ管理は内部で勝手にやってくれます。
例:push_backで追加すると、必要に応じてサイズが自動伸張される。

std::vector<Test> a(10);
for(int i = 0;i<10;i++){
 a.push_back(...); //ここでTESTの配列aに値を入れる
// a[i] = ... みたいな記述でも可能
}
int cnt = 12;
if( cnt > 10 ){
a.resize(cnt);
}
// もしくは、最初からサイズなど気にせずa.push_backすれば
// 必要に応じて自動的にサイズが増える。



# ちなみに、自分で new[] するときはdeleteもdelete[]にしてください。

Qnew と malloc によるメモリの動的確保について

初めて投稿させて頂きます。よろしくお願い致します。
現在、以下のような、2次元配列による動的なメモリの確保を意図して、コードをC/C++にて記述しています。
(コンパイラはMINGW32のg++ 3.4.5)

//mallocによるメモリ動的確保
data = (char **)malloc(num * sizeof(char*));
for(i=0; i<rowNum; i++){
data[i] = (char *)malloc(sizeof(char)*256);
}

//newによるメモリ動的確保
data = new char*[rowNum];
for(i=0; i<rowNum; i++){
data[i] = new char;
}

C++で書くのならば、
「mallocによるメモリ確保は辞め、newによるメモリ確保をしなさい」
という指摘が、書籍でもwebでもありましたので、
両方書き、両者を比べているのですが、理由がイマイチ分かりません。

10万行ほどのテキストデータで実験させてみたのですが、
mallocによる記述の方が、動作が数秒速いようなのです。

それで、new やmalloc で実際何をやっているのか、コードを見ようと思ったのですが、

newでは、

void* operator new(std::size_t) throw (std::bad_alloc);
void* operator new[](std::size_t) throw (std::bad_alloc);
void* operator new(std::size_t, const std::nothrow_t&) throw();
void* operator new[](std::size_t, const std::nothrow_t&) throw();
inline void* operator new(std::size_t, void* __p) throw() { return __p; }
inline void* operator new[](std::size_t, void* __p) throw() { return __p; }

というnewファイルの記述で行き詰まり、

malloc は malloc_allocator.hというファイルで行き詰りました。

以上を踏まえて、
1)そもそも、上記のメモリ動的確保記述はスマートな書き方なのか
2)実際に、newやmallocは、どういった手法でメモリ領域を確保しているのか

以上の2点について、ご教授下さい。よろしくお願い致します。

初めて投稿させて頂きます。よろしくお願い致します。
現在、以下のような、2次元配列による動的なメモリの確保を意図して、コードをC/C++にて記述しています。
(コンパイラはMINGW32のg++ 3.4.5)

//mallocによるメモリ動的確保
data = (char **)malloc(num * sizeof(char*));
for(i=0; i<rowNum; i++){
data[i] = (char *)malloc(sizeof(char)*256);
}

//newによるメモリ動的確保
data = new char*[rowNum];
for(i=0; i<rowNum; i++){
data[i] = new char;
}

C++で書くのならば、
「malloc...続きを読む

Aベストアンサー

まあ, operator new[] は operator delete[] のための管理情報を追加しなきゃならないのでどうしても malloc より遅くなる (少なくとも「速くなることだけはない」) んですけどね....
どうしても速度が欲しいなら malloc, お手軽を求めるなら std::vector を使うのが普通かな. ああ, 今どき 3.4.5 もどうかと思うので 4.3.3 なり 4.4.2 にするってのも考えるべきかと.

Q配列動的確保

結論から申しますと,aaa[値1][値2][値3][値4]配列を動的に確保したいのです.

unsigned short *****aaa;
という方法では確保できるのですが,unsigned short ****aaaとようにしてできるのでしょうか?

この他にも違う方法があればご教授ください.

どうぞよろしくお願いいたします.

Aベストアンサー

unsigned short ****aaa;
では、アドレスを保存する領域は確保されますが、
実際にデータを格納するメモリ領域まで確保される訳ではありません。

malloc関数でメモリ領域を確保しないと、
何時アプリケーションエラーを起こすかわからない
危険なプログラムが出来上がります。

aaa = malloc( sizeof( unsigned short **** ) * 値1 ) ;
for (i=0 ; i<値1 ; i++ ) {
aaa[i] = malloc( sizeof( unsigned short *** ) * 値2 ) ;
for (j=0 ; j<値2 ; j++ ) {
aaa[i][j] = malloc( sizeof( unsigned short ** ) * 値3 ) ;
for (k=0 ; k<値3 ; k++ ) {
aaa[i][j][k] = malloc( sizeof( unsigned short * ) * 値4 ) ;
for (l=0 ; l<値4 ; l++ ) {
aaa[i][j][k][l] = malloc( sizeof( unsigned short ) ) ;
}
}
}
}

こんな感じで領域確保をしないと駄目です。
これは処理の途中で値1~4の値が全てわかる時の例です。
処理が進むたびに領域が必要になる場合は、
当然のことながら、その都度メモリ領域を確保する様にしなければなりません。

unsigned short ****aaa;
では、アドレスを保存する領域は確保されますが、
実際にデータを格納するメモリ領域まで確保される訳ではありません。

malloc関数でメモリ領域を確保しないと、
何時アプリケーションエラーを起こすかわからない
危険なプログラムが出来上がります。

aaa = malloc( sizeof( unsigned short **** ) * 値1 ) ;
for (i=0 ; i<値1 ; i++ ) {
aaa[i] = malloc( sizeof( unsigned short *** ) * 値2 ) ;
for (j=0 ; j<値2 ; j++ ) {
aaa[i][j] = malloc( sizeof( un...続きを読む


人気Q&Aランキング

おすすめ情報